语法不正确 - T-Sql

时间:2013-11-28 17:01:02

标签: sql sql-server tsql stored-procedures

我们的想法是拥有一个通用存储过程来从所有表中获取数据。此查询提供错误

  

语法错误@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

2 个答案:

答案 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不能存在,因为ASCDESC是<{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
相关问题