【问题标题】:Error in exec SQL Server queryexec SQL Server 查询中的错误
【发布时间】:2023-03-11 16:01:01
【问题描述】:

我是 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],[Address],(SELECT TOP 1 COUNT(Id) FROM [Brochure]) 转换为 AllSampleCount FROM [Brochure]WHERE [Id] IN (SELECT TOP 15 Id 从 ##temp WHERE RN >' 到数据类型 int。

【问题讨论】:

  • 只需将 ((QUOTENAME(@Count)-1)*15) 替换为 STR((@Count-1)*15)

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


【解决方案1】:

COUNT 是数字,因此需要转换为 STR

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

【讨论】:

    【解决方案2】:

    替换这个:

    您需要将@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'
    

    【讨论】:

      【解决方案3】:

      在这个片段中:

      ((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),也可以不进行显式转换,如上所述 - 它将自动转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多