如何将变量值与 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 表中?的主要内容,如果未能解决你的问题,请参考以下文章