如何将变量值与 select 语句的结果一起放入 sql 表中?

Posted

技术标签:

【中文标题】如何将变量值与 select 语句的结果一起放入 sql 表中?【英文标题】:How can I a variable value into a sql table along with the results from a select statement? 【发布时间】:2019-07-01 18:31:55 【问题描述】:

我正在尝试将 SQL 选择语句的结果与 FETCH 循环内的 SQL 变量中的值一起插入表中。我可以只对选择结果进行插入,但不知道如何插入变量值。

这是我尝试过的:

IF CURSOR_STATUS('global','CURSOR_ALLDB_NAMES')>=-1
BEGIN
 DEALLOCATE CURSOR_ALLDB_NAMES
END
IF OBJECT_ID('tempdb..#TempIDs') IS NOT NULL DROP TABLE #TempIDs

CREATE TABLE #TempIDs(
 ID char(256)
 ,DBName char(256))

DECLARE @DB_NAME nvarchar(256);

DECLARE CURSOR_ALLDB_NAMES CURSOR FOR
SELECT name 
FROM Sys.Databases
WHERE name like 'ZM_%' 

OPEN CURSOR_ALLDB_NAMES

FETCH CURSOR_ALLDB_NAMES INTO @DB_NAME

WHILE @@Fetch_Status = 0
BEGIN
--  if  OBJECT_ID(@DB_NAME + '.dbo.Userlist') is not null   EXEC('Insert into #TempIDs (ID) Select ID from '+ @DB_NAME + '.dbo.Userlist')
  if  OBJECT_ID(@DB_NAME + '.dbo.Userlist') is not null   EXEC('Insert into #TempIDs (ID, DBName) Select ID, @DB_NAME from '+ @DB_NAME + '.dbo.Userlist')
  FETCH CURSOR_ALLDB_NAMES  INTO @DB_NAME
END

Select * from #TempIDs

我得到了这个结果:

Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@DB_NAME".

我也试过这个,但没有用:

if  OBJECT_ID(@DB_NAME + '.dbo.Userlist') is not null   EXEC('Insert into #TempIDs (ID, set DBName=''' +@DB_NAME + ''') Select ID  from '+ @DB_NAME + '.dbo.Userlist')
  FETCH CURSOR_ALLDB_NAMES  INTO @DB_NAME

这也不起作用:

if  OBJECT_ID(@DB_NAME + '.dbo.Userlist') is not null   EXEC('Insert into #TempIDs (ID, DBName=''' +@DB_NAME + ''') Select ID  from '+ @DB_NAME + '.dbo.Userlist')
  FETCH CURSOR_ALLDB_NAMES  INTO @DB_NAME

【问题讨论】:

你试过双引号吗? Select ID from '''+ @DB_NAME + '''.dbo.Userlist' @Jeremy,我尝试了你的建议,但这不是我遇到问题的地方,它也给出了一个错误,因为这不是我试图使用 (at)DB_NAME 值的地方,所以我尝试了这个:'插入#TempIDs(ID,DBName)从'+(at)DB_NAME +'.dbo.Userlist'中选择ID,''(at)DB_NAME''。这并没有给出错误,但是它将文字 (at)DB_NAME 放在列中,而不是 (at)DB_NAME 的值。 ...顺便说一句,使用 (at) 来表示 at 符号,因为 *** 一直在抱怨。 考虑到原来的错误在这里from '+ @DB_NAME + '.dbo.Userlist,你确实把路径写满了; 'DB'.'方案'.'表'。当您从游标中的动态 SQL 开始时,您不在同一个执行上下文中。进行调试的一种简单方法是将动态查询分配给 var 并使用 EXEC(@query)PRINT(@query) 进行切换,如果您可以执行输出打印,那么它将在 EXEC() 中工作 您的两个INSERT 语句都不正确。相反:'Insert into #TempIDs (ID, DBName) Select ID, ''' + @DB_NAME + ''' from ' + @DB_NAME + '.dbo.Userlist' 试一试,我想你会得到它。 【参考方案1】:

感谢 cmets 中的@JNevil:

更改 SQL 语句。此行已更改,现在可以使用:

  if OBJECT_ID(@DB_NAME + '.dbo.Userlist') is not null EXEC('Insert into #TempIDs (ID, DBName) Select ID, ''' + @DB_NAME + ''' from ' + @DB_NAME + '.dbo.Userlist')

【讨论】:

以上是关于如何将变量值与 select 语句的结果一起放入 sql 表中?的主要内容,如果未能解决你的问题,请参考以下文章

将变量值分配给模板中的表单域

如何将变量值用作JS对象中的属性[重复]

如何将变量值“传递”给 JSON 动态对象?

PHP mysqli - 从准备好的语句返回关联数组

如何将变量值传递给julia中的宏?

如何将变量值传递给套接字字符串