Jam*_*ons 2 sql t-sql sql-server stored-procedures sql-server-2005
我试图将SQL查询的结果存储到变量中.查询只是检测列的数据类型,因此返回的结果是单个varchar.
SET @SQL =
'declare @@x varchar(max) SET @@x = (select DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_name = ' +char(39)+@TabName+char(39) +
' AND column_name = ' +char(39)+@colName+char(39) + ')'
EXECUTE (@SQL)
Run Code Online (Sandbox Code Playgroud)
"SET声明"中的任何内容都无法访问它之外的任何变量,反之亦然,因此我坚持如何将此查询的结果存储在varchar变量中,以供存储过程的其他部分访问.
您不需要动态查询来实现您想要的,下面的查询将给出与您相同的结果.
declare @x varchar(max)
declare @tableName varchar(100), @ColumnName varchar(50)
set @tableName = 'Employee'
set @ColumnName = 'ID'
select @x = DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
where
Table_Name = @tableName
and column_name = @ColumnName
select @x
Run Code Online (Sandbox Code Playgroud)
T-SQL 中的所有用户定义变量仅具有私有局部作用域。它们不能被任何其他执行上下文看到,甚至不能被嵌套执行上下文看到(与 #temp 表不同,#temp 表可以被嵌套作用域看到)。使用 ” @@ ”试图欺骗它来创建全局变量是行不通的。
如果你想执行动态 SQL 并返回信息,有几种方法可以实现:
使用sp_ExecuteSQL并将参数之一设为OUTPUT
参数(建议用于单个值)。
在调用动态 SQL 之前创建一个 #Temp 表,然后让动态 SQL 写入同一个 #Temp 表(建议用于多个值/行)。
使用该INSERT..EXEC
语句执行动态 SQL,该 SQL 将其信息作为 SELECT 语句的输出返回。如果INSERT
表的格式与动态 SQL 的SELECT
输出相同,则数据输出将插入到您的表中。
如果只想返回整数值,可以通过RETURN
动态 SQL 中的语句来实现,并通过@val = EXEC('...')
.
使用会话上下文信息缓冲区(不推荐)。
然而,正如其他人指出的那样,您实际上不需要动态 SQL 来实现此处向我们展示的内容。您可以通过以下方式做到这一点:
SET @x = ( SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_name = @TabName
AND column_name = @colName )
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4091 次 |
最近记录: |