Sql 基于变量执行查询

Sql 基于变量执行查询,sql,sql-server,sql-server-2012,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

我想问一下,如何才能成功提交基于变量的查询

我有一个数据库,它有大约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;
我已经读过了,不允许用这种方式做这个动作

所以我的问题是,怎样才能得到我想要的价值观


谢谢大家!

我将使用系统视图生成动态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

我将使用系统视图生成动态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

你说你不被允许是什么意思?您是否遇到错误?EXEC或sp_executesql的作用域与当前查询不同,因此您无法访问@Guids,在您的情况下,您应该在EXEC查询中使用临时表,例如GUID。您不能在函数中使用动态sql。使用存储过程我会问为什么?需要从所有表中获取所有guid值似乎是一项非常奇怪的任务。你可能想用它来完成什么?如果这只是一个练习,我建议您查看sys.columns和sys.tables,以查找所有具有您要查找的数据类型的列。那么它也不必是名为Id的列。表变量@Guids不在范围之外。查询本身应该很好。但是,如果您是在函数中实现此功能,那么它将不起作用,因为函数不允许动态SQL,您说不允许是什么意思?您是否遇到错误?EXEC或sp_executesql的作用域与当前查询不同,因此您无法访问@Guids,在您的情况下,您应该在EXEC查询中使用临时表,例如GUID。您不能在函数中使用动态sql。使用存储过程我会问为什么?需要从所有表中获取所有guid值似乎是一项非常奇怪的任务。你可能想用它来完成什么?如果这只是一个练习,我建议您查看sys.columns和sys.tables,以查找所有具有您要查找的数据类型的列。那么它也不必是名为Id的列。表变量@Guids不在范围之外。查询本身应该很好。但是,如果您是在函数中实现这一点,这将无法工作,因为函数不允许动态sqlThis看起来真的很棒!我将从中得到一些启示。非常感谢^^这看起来真的很棒!我将从中得到一些启示。非常感谢^^