我想问一下如何基于变量成功提交查询。
我有一个数据库,其中包含约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;
我了解到不允许以这种方式执行此操作。
所以我的问题是什么方法可以正确地获得我想要的值?
谢谢大家!
答案 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