SQL Server 2008 R2数据库名称不能替换为字符串?

时间:2014-07-21 22:16:24

标签: sql sql-server windows-7 sql-server-2008-r2

我正在尝试在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多个数据库?

谢谢

2 个答案:

答案 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