2
declare @qry as varchar(max)
declare @db as varchar(25)
declare @item as varchar(25)
declare @U_Parentcode as varchar(25)


set @U_Parentcode ='CDM51306520'
set @db ='Marda_Test'
set @qry ='select @item =itemcode from ' + @db + '.[dbo].[OITM]  where ItemCode=''' + @U_Parentcode +''''
execute (@qry)
print @item

收到类似“必须声明标量变量“@item”之类的错误。

4

2 回答 2

3

动态 sql 在与代码上下文不同的上下文中执行,因此基本上没有@item在那里声明变量。

您需要使用sp_executeSqlwhich 包含将变量映射到块中的变量的机制。语法有点迟钝,但是当你习惯它时就会很明显。

declare @qry as nvarchar(max)
declare @db as varchar(25)
declare @outsideItem as varchar(25)
declare @U_Parentcode as varchar(25)

set @U_Parentcode ='CDM51306520'
set @db ='Marda_Test'
set @qry ='select @insideItem =itemcode from ' + @db + '.[dbo].[OITM]  where ItemCode=''' + @U_Parentcode +''''

execute sp_executesql @qry, N'@insideItem varchar(25) output', @insideItem = @outsideItem output
print @item

第一个参数是查询,与 with 相同exec()
在您的情况下,第二个参数是查询中使用的所有参数的声明@insideItem
第三个(以及任何后续)参数是一个映射,它说明哪个内部参数应该映射到哪个外部参数。输出子句(用于变量声明和映射)是该参数用作查询输出值的指示符。

于 2013-09-04T06:51:54.210 回答
0

您的declare陈述不包含在@qry内容中。

此外,你为什么还要打扰execute?为什么不只使用普通查询。参数化连接字符串,以便连接到正确的数据库并运行正常查询。

于 2013-09-04T06:46:44.990 回答