【发布时间】:2019-04-13 18:51:00
【问题描述】:
我在将 sql 语句 (MS SQL) 数据库声明为变量时遇到问题,我有这个过程, 任何人都可以帮助谢谢:)
DECLARE @ID int = 700001158
DECLARE @STRING VARCHAR(250) = 'StringResource_EN'
SELECT string.[value],item.[id] FROM ItemResource item LEFT JOIN **@STRING** string ON item.[name_id] = string.[code]
WHERE item.[id] = @ID
我得到了错误:
[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]必须声明表变量“@STRING”。 (1087) 块引用
虽然应该是这样的结果:
id = 700001158 value = Devildom Purge: Shield
编辑: 我试过了
DECLARE @ID int = 700001158
DECLARE @STRING VARCHAR(250) = 'StringResource_EN'
DECLARE @sql NVARCHAR(1000)
SET @sql = 'SELECT string.[value],item.[id] FROM ItemResource item LEFT JOIN '+@STRING+' string ON item.[name_id] = string.[code]
WHERE item.[id] = @ID'
EXEC sp_executesql @sql;
我也得到了这个
[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]必须声明标量变量“@ID”。 (137)
【问题讨论】:
-
也总是包含错误信息。它们很重要。请解释一下“数据库作为变量”是什么意思
-
好的,谢谢,我会添加
-
另外,如果
@IN_STRING_DB是一个动态对象,则没有理由将其声明为nvarchar(255)。对象名称的最长长度为 128 个字符,因此请使用nvarchar(128)或sysname。 -
如果您想将数据库声明为变量,您有两种选择:1) 通过将 sql 命令存储在变量中来使用动态 sql,或者 2) 使用 sqlcmd 模式,您可以在其中标记数据库名称作为变量docs.microsoft.com/en-us/sql/ssms/scripting/…
-
为了回答您的问题,在您的第二个块中,您在语句中嵌入了字符串 @id,而不是该变量中包含的 value。您的逻辑也不正确(或您的描述具有误导性)。 [at]string 中包含的值必须是对象名称 - 您说的是数据库名称,但这是不正确的。鉴于术语问题,您应该重新考虑导致此路径的决策。这超出了您的技能水平,您将难以实施和维护。
标签: sql-server tsql