基于变量执行查询

时间:2018-08-14 13:31:08

标签: sql sql-server sql-server-2012

我想问一下如何基于变量成功提交查询。

我有一个数据库,其中包含约50个表以及许多列。我需要从表中所有这些列中获取所有UNIQUEIDENTIFIER数据。

这是应该加载所有这些值的代码:

DECLARE @TableNames TABLE
(
    ID INT NOT NULL IDENTITY(0, 1),
    TableName NVARCHAR(50) NOT NULL,
    ColName NVARCHAR(50) NOT NULL
);

DECLARE @Guids TABLE
(
    ID INT NOT NULL IDENTITY(0, 1),
    FoundGuid UNIQUEIDENTIFIER NOT NULL
);    

DECLARE @Local NVARCHAR(50);
WHILE @Counter < 500
BEGIN
    SELECT @Local = TableName FROM @TableNames WHERE Id = @Counter;
    INSERT INTO @Guids EXEC('SELECT Id FROM [' + @Local + ']');
    SET @Counter = @Counter + 1;
END;

我了解到不允许以这种方式执行此操作。

所以我的问题是什么方法可以正确地获得我想要的值?

谢谢大家!

1 个答案:

答案 0 :(得分:2)

我将使用系统视图来生成动态sql。这是100%准确的,并且不仅限于那些名为Id的列。使用哪种模式或列名称都没有关系。这将使您获得所有这些值,而根本没有循环。

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + 'select ' + QUOTENAME(c.name) + ' = ' + QUOTENAME(c.name)
    + ' FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name)
    + ' UNION ALL '
from sys.tables t
join sys.columns c on c.object_id = t.object_id
join sys.types ty on ty.user_type_id = c.user_type_id
join sys.schemas s on s.schema_id = t.schema_id
where ty.name = 'uniqueidentifier'

--removes the last UNION ALL
select @SQL = left(@SQL, len(@SQL) - 10)

select @SQL

--uncomment below to execute the dynamic sql when you are comfortable it is correct
--exec sp_executesql @SQL