2014-02-05 72 views
-3

当我编译没有任何问题,但是当我执行这个存储过程,我得到:附近有语法错误“”在SQL动态查询

附近有语法错误“”

我不能为我的生命找出其中的问题是:

DECLARE @sql nvarchar(4000) 
SET @sql = 'SELECT idea, id, posted_by 
    FROM 
    (idea,id, posted_by, ROW_NUMBER() OVER(ORDER BY ' + @sortExpression + ') as RowNum 
    FROM ideas e 
    INNER JOIN buckets d ON 
     e.bucket_id = d.id 
    WHERE e.bucket_id = ' + CONVERT(nvarchar(10), @bucketId) + ' 
) as EmpInfo 
    WHERE RowNum BETWEEN ' + CONVERT(nvarchar(10), @startRowIndex) + 
      ' AND (' + CONVERT(nvarchar(10), @startRowIndex) + ' + ' 
      + CONVERT(nvarchar(10), @maximumRows) + ') - 1' 

EXEC sp_executesql @sql 
+0

您可以输出'@ sql'变量并在此处发布结果。准备好的语句是正确的,但串联的字符串可能不是。这意味着'EXEC'功能导致错误。 –

+7

该子查询看起来像缺少其“SELECT”。 –

+0

使用“print(@sql)”在'EXEC' –

回答

1

你在你的内部查询的开始需要一个SELECT

DECLARE @sql nvarchar(4000) 
SET @sql = 'SELECT idea, id, posted_by 
    FROM 
(**SELECT** idea,id, posted_by, ROW_NUMBER() OVER(ORDER BY ' + @sortExpression + ') as RowNum 
FROM ideas e 
INNER JOIN buckets d ON 
    e.bucket_id = d.id 
WHERE e.bucket_id = ' + CONVERT(nvarchar(10), @bucketId) + ' 
) as EmpInfo 
WHERE RowNum BETWEEN ' + CONVERT(nvarchar(10), @startRowIndex) + 
     ' AND (' + CONVERT(nvarchar(10), @startRowIndex) + ' + ' 
     + CONVERT(nvarchar(10), @maximumRows) + ') - 1' 

EXEC sp_executesql @sql 

希望能正确显示。我试图大胆工作选择

0

你缺少内部select

DECLARE @sql nvarchar(4000) 
SET @sql = 'SELECT idea, id, posted_by 
    FROM 
    (**SELECT** idea,id, posted_by, ROW_NUMBER() OVER(ORDER BY ' + @sortExpression + ') as RowNum 
    FROM ideas e 
    INNER JOIN buckets d ON 
     e.bucket_id = d.id 
    WHERE e.bucket_id = ' + CONVERT(nvarchar(10), @bucketId) + ' 
) as EmpInfo 
    WHERE RowNum BETWEEN ' + CONVERT(nvarchar(10), @startRowIndex) + 
      ' AND (' + CONVERT(nvarchar(10), @startRowIndex) + ' + ' 
      + CONVERT(nvarchar(10), @maximumRows) + ') - 1' 

EXEC sp_executesql @sql 
3

你不应该连接所有这些东西变成动态SQL。事实上,你应该尝试使用ORDER BY表达式而不用引入动态SQL,但是我知道当用户可以选择多列,不同数据类型和两个方向时(I discussed this problem here),所以请传入另一个参数安全:

DECLARE @sql nvarchar(4000); -- always use semi-colons 

DECLARE @r INT; 

SET @r = @startRowIndex + @maximumRows - 1; 

SET @sql = 'SELECT idea, id, posted_by 
FROM 
(
    SELECT -- this was your actual problem 
    idea,id, posted_by, -- you should prefix these with the alias 
    ROW_NUMBER() OVER (ORDER BY ' + @sortExpression + ') as RowNum 
    FROM dbo.ideas e -- always use schema prefix 
    INNER JOIN dbo.buckets d ON 
    e.bucket_id = d.id 
    WHERE e.bucket_id = @bucketId 
) as EmpInfo 
WHERE RowNum BETWEEN @startRowIndex AND @r;'; 

EXEC sp_executesql @sql, N'@startRowIndex INT, @bucketId INT, @r INT', 
    @startRowIndex, @bucketId, @r; 

对于我的一些评论:

此外,如果您使用SQL Server 2012,则应该使用OFFSET/FETCH