我正在尝试在Win7上的Management Studio中运行SQL Server 2008 R2查询。
我需要访问50多个名称相似的数据库。
但是,我收到了数据库名称的错误:
DECLARE @name1 VARCHAR(16)
SET @name1 = 'HisName_'
DECLARE @whole_name VARCHAR(18)
DECLARE @a_person VARCHAR(2)
DECLARE @a_curosr CURSOR
SET @a_curosr = CURSOR FAST_FORWARD
FOR
SELECT personName FROM @person_names -- @person_names is a table that hold person names
OPEN @a_curosr
FETCH NEXT FROM @a_curosr INTO @a_person
WHILE @@Fetch_Status=0
BEGIN
SET @whole_name = @name1 + @a_person
INSERT INTO [dbo].[mytable]
SELECT a.person_id
FROM [@full_name].[dbo].[myOldTable] as a -- error here, @full_name is Invalid object name
FETCH NEXT FROM @a_curosr INTO @a_person
END
我创建了名为[@full_name].[dbo].[myOldTable] hre
的表格,@full_name
是一个字符串,例如HisName_
+两个字母的字符串。
为什么数据库名称不能替换为字符串,以便我可以在循环中访问50多个数据库?
谢谢
答案 0 :(得分:1)
我试图用动态sql语句编写脚本。请注意注释部分(sp_executeSQL部分)。这是:
DECLARE @name1 VARCHAR(16)
SET @name1 = 'HisName_'
DECLARE @whole_name VARCHAR(18)
DECLARE @person_names TABLE (personName varchar(2))
INSERT INTO @person_names (personName) VALUES ('AA')
INSERT INTO @person_names (personName) VALUES ('MD')
INSERT INTO @person_names (personName) VALUES ('AS')
DECLARE @sqlString AS nvarchar(MAX);
DECLARE @a_person VARCHAR(2)
DECLARE @a_curosr CURSOR
SET @a_curosr = CURSOR FAST_FORWARD
FOR
SELECT personName FROM @person_names -- @person_names is a table that hold person names
OPEN @a_curosr
FETCH NEXT FROM @a_curosr INTO @a_person
WHILE @@Fetch_Status=0
BEGIN
SET @whole_name = @name1 + @a_person
SET @sqlString = 'INSERT INTO [dbo].[mytable]
SELECT a.person_id
FROM [' + @whole_name + '].[dbo].[myOldTable] as a'
SELECT @sqlString -- execute the statement on the next line instead
--EXEC sp_executeSql @sqlString;
FETCH NEXT FROM @a_curosr INTO @a_person
END
希望这有帮助。
答案 1 :(得分:0)
问题是SQL Server不会将变量扩展为命名标识符。所以[@full_name]正在寻找名称为“@full_name”的数据库,该数据库不存在。
这里有两种方法。
一,使用SP迭代实例中的所有数据库:sp_msforeachdb
二,使用动态SQL并在循环中修改它以执行:See answer here