Sql存储过程 如何动态修改sql语句!

ALTER PROCEDURE [dbo].[ProductPageNew_CN]
-- 传入最大显示纪录数和当前页码
@MaxPageSize int,
@PageNum int,
@type int,
@ProAtt1 int,
@ProAtt2 int,
@ProAtt3 int,
@ProAtt4 int,
@ProPrice int,
@Count int output
AS
BEGIN
SET NOCOUNT ON;

DECLARE
@Name nvarchar(50),
@Cursor int,
@SqlWhere nvarchar(500),
@SQLString nvarchar(500)

-- 设置动态Where
if(@ProAtt1>0)
set @SqlWhere = @SqlWhere+' and ProAtt1='+@ProAtt1
if(@ProAtt2>0)
set @SqlWhere = @SqlWhere+' and ProAtt2='+@ProAtt2
if(@ProAtt3>0)
set @SqlWhere = @SqlWhere+' and ProAtt3='+@ProAtt3
if(@ProAtt4>0)
set @SqlWhere = @SqlWhere+' and ProAtt4='+@ProAtt4
if(@ProPrice>0)
set @SqlWhere = @SqlWhere+' and ProPrice='+@ProPrice

-- 首先得到纪录总数
Select @Count = count(ID)
FROM NetDIY_Products_CN Where 1=1;

-- 定义游标需要开始的位置
Set @Cursor = @MaxPageSize*(@PageNum-1)+1
-- 如果游标大于纪录总数将游标放到最后一页开始的位置
IF @Cursor > @Count
BEGIN
-- 如果最后一页与最大每次纪录数相等,返回最后整页
IF @Count % @MaxPageSize = 0
Set @Cursor = @Count - @MaxPageSize + 1
-- 否则返回最后一页剩下的纪录
ELSE
Set @Cursor = @Count - (@Count % @MaxPageSize) + 1
END
-- 将指针指到该页开始

Set Rowcount @Cursor
-- 得到纪录开始的位置
Select @Name = weighting
FROM NetDIY_Products_CN Where 1=1
orDER BY weighting desc;

-- 设置开始位置
Set Rowcount @MaxPageSize
-- 得到该页纪录
SELECT *
FROM NetDIY_Products_CN
Where weighting <= @Name
order By weighting desc
Set Rowcount 0
END

如何在sql后面加入变量@SqlWhere?

利用动态sql:
将整个sql语句编辑成一个字符串,最终通过execute语句来执行动态sql追问

Select @Count = count(ID)
FROM NetDIY_Products_CN
那么这个呢?需要把结果返回到@Count中,要怎么在这个sql加上@SqlWhere 条件语句

追答

exec('select ' + @Count + '= count(ID) from NetDIY_Products_CN ' + @SqlWhere)

追问

SELECT * FROM NetDIY_Products_CN Where weighting <= @Name order By weighting desc
exec('select * FROM NetDIY_Products_CN Where weighting <= '+@Name+' ' + @SqlWhere+' order By weighting desc')
两种都出错

追答

weighting 是不是数值型的?

是的话,需要将@Name类型转换一下。

另外,exec('select * FROM NetDIY_Products_CN Where weighting <= '+@Name+' ' + @SqlWhere+' order By weighting desc')这个语句你要干什么,
如果要得到查询结果,建议用游标处理,否则这样执行,没有任何意义。

追问

不行,好象这样写不能将值回滚到@Count

追答

那你试试下面这种写法,变量sql的定义略去:
sql:='select count(ID) from NetDIY_Products_CN where 1=1 ' + @SqlWhere;

EXECUTE IMMEDIATE sql into @Count;

之前那个sql语句中,没有加where 1=1这句(没仔细看你的原文),所以报错,不妨加上这句,再运行一次看看。
exec('select ' + @Count + '= count(ID) from NetDIY_Products_CN where 1 =1 ' + @SqlWhere)

温馨提示:答案为网友推荐,仅供参考
相似回答