我是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。
答案 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),如其他人所建议的那样,或者保留它而不进行显式转换,如上所述 - 它将自动转换。