exec SQL Server查询出错

时间:2014-11-26 07:28:10

标签: sql-server sql-server-2008 stored-procedures

我是SQL Server的初学者。

我编写此查询并使用@tblName@count

传递给此表名称和计数
DECLARE @Base nvarchar(200) 

if  (object_ID('tempdb..##temp')) is not NULL
    DROP TABLE ##temp

SET @Base = 'WITH Base AS (SELECT [picName],[Address],ID, ROW_NUMBER() OVER (ORDER BY Id DESC) RN FROM'
                + Quotename(@tblName) + ' GROUP BY [picName],[Address],ID)
                SELECT * INTO ##temp FROM Base'

EXEC (@Base)

SELECT *
FROM ##temp

declare @command nvarchar(max)

set @command='SELECT TOP 15 [picName],[Address],(SELECT TOP 1 COUNT(Id) FROM ' + QUOTENAME(@tblName) + ') as AllSampleCount FROM ' + QUOTENAME(@tblName) +
             'WHERE [Id] IN (SELECT TOP 15 Id From ##temp WHERE RN >'+ ((QUOTENAME(@Count)-1)*15)+ 'ORDER BY Id DESC) ORDER BY Id DESC'

exec (@command)

drop table ##temp

但我收到此错误

  

将nvarchar值'SELECT TOP 15 [picName],[地址],(SELECT TOP 1 COUNT(Id)FROM [Brochure])转换为AllSampleCount FROM [Brochure] WHERE [Id] IN(SELECT TOP 15)时转换失败Id从## temp WHERE RN>'到数据类型int。

3 个答案:

答案 0 :(得分:0)

替换这个:

您需要将@Count转换为nvarchar(20)

 set @command='SELECT TOP 15 [picName],[Address],(SELECT TOP 1 COUNT(Id) FROM ' + QUOTENAME(@tblName) + ') as AllSampleCount FROM ' + QUOTENAME(@tblName) +
             'WHERE [Id] IN (SELECT TOP 15 Id From ##temp WHERE RN >'+ 
             QUOTENAME(CAST((@Count-1)*15 as NVARCHAR(20))) + ' ORDER BY Id DESC) ORDER BY Id DESC'

答案 1 :(得分:0)

COUNT是数字,因此需要转换

QUOTENAME(CONVERT(NVARCHAR(10),@Count-1)*15  ) + 'ORDER BY Id DESC) ORDER BY Id DESC'

答案 2 :(得分:0)

在这个片段中:

((QUOTENAME(@Count)-1)*15)

QUOTENAME的参数是@Count,但我的猜测是实际的参数应该是(@Count-1)*15。问题是如何放置括号。 -1(以及之后的*15)逻辑上应用于QUOTENAME的结果,而不是@Count。这导致整个连接表达式被视为数字和SQL Server,因此,尝试将其中的所有参数转换为数字。它无法转换第一个'SELECT TOP 15 ...',这就是错误的原因。

如果你重写上面的QUOTENAME片段:

QUOTENAME((@Count-1)*15)

问题将会消失。

请注意,QUOTENAME需要一个字符串,您的参数是数字。在这种情况下,您可以将数值表达式的结果显式转换为字符串(使用CAST或CONVERT),如其他人所建议的那样,或者保留它而不进行显式转换,如上所述 - 它将自动转换。