我们的想法是拥有一个通用存储过程来从所有表中获取数据。此查询提供错误
语法错误@OrderByClause。
我哪里错了?
declare @TableName nvarchar(50), @ColName nvarchar(50),
@OrderByClause nvarchar(50), @Code nvarchar(max),
@StartIndex nvarchar(50), @EndIndex nvarchar(50)
set @TableName = 'tblCountry'
set @ColName = 'countryname'
set @OrderByClause = 'desc'
set @StartIndex = '2'
set @EndIndex = '10'
select @Code = 'With temp as (select row_number()
over (order by @ColName @OrderByClause) as row, * from @TableName)
select * from temp where row between @StartIndex and @EndIndex'
set @param = '@TableName nvarchar(50), @ColName nvarchar(50),
@OrderByClause nvarchar(50), @StartIndex nvarchar(50),
@EndIndex nvarchar(50)'
execute sp_executesql @Code, @param @colname, @OrderByClause, @TableName,
@StartIndex, @EndIndex
修改:
这虽然有效....
select @code = 'with temp as (select row_number() over (order by '+
@colname+' '+@OrderByClause+') as row, * from '+@tablename+')
select * from temp where row between '+@startIndex+' and '+@EndIndex
execute sp_executesql @code
答案 0 :(得分:2)
你错过了最后一句话的逗号:
execute sp_executesql @Code, @param @colname, @OrderByClause, @TableName,
应该是
execute sp_executesql @Code, @param, @colname, @OrderByClause, @TableName,
第二件事是@RahulTripathi是正确的(但由于其他原因),这是无效的:
select @Code = 'With temp as (select row_number()
over (order by @ColName @OrderByClause) as row, * from @TableName)
select * from temp where row between @StartIndex and @EndIndex'
@OrderByClause
不能存在,因为ASC
和DESC
是<{1}}子句的语法元素,不能是变量。
接下来,您尚未在动态SQL中正确定义@TableName。您在上面的命令中将它用作表变量,但是您将它作为ORDER BY
传递(并定义)。
答案 1 :(得分:0)
我认为你的变量既没有在sp_executesql范围内被解释(在desc的情况下)。 在分配@code:
时,在使用+和引号调用sp_executesql之前尝试“展开”select @Code = 'With temp as (select row_number()
over (order by '+ @ColName +' '+ @OrderByClause +' ) as row, * from '+ @TableName +')
select * from temp where row between '+ @StartIndex + ' and '+@EndIndex
(只做了一行)
或者您可以将参数传递给sp_executesql,但您必须选择不同的名称 而不是@ColName,@ tableName和@OrderByClause我猜(你不能在查询中的任何地方放置变量而不是sql文本)
select @Code = 'With temp as (select row_number()
over (order by '+@ColName+' '+@OrderByClause+') as row, * from '+@TableName+')
select * from temp where row between @pStartIndex and @pEndIndex'
execute sp_executesql @code, @pStartIndex=@StartIndex, @pEndIndex=@EndIndex