执行列中的所有查询

时间:2017-09-12 21:04:34

标签: sql-server sql-server-2008

我有一个下面的表结构 - sql server中的QueryDetails

 AccountNo   TableName    ColumnName     ColumnValue   Query
 1           account        balance          123       update account set balance = 123 where AccountNo = 1
 2           loan           emi             1000       update loan set emi = 1000 where AccountNo = 2

我需要一个语法或查询来执行Query列中的所有sql查询,而不是选择列查询并手动执行它。

3 个答案:

答案 0 :(得分:1)

由于你将被迫在这里使用动态,我会做这样的事情,所以你不必使用光标。

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + Query + ';'
from YourTable

exec sp_executesql @SQL

请注意,我不容忍在表格中存储此类查询。而且我不会宽恕他们。它可能容易受到SQL注入攻击。

如果您尝试根据表中的数据构建查询,则可能是这样的。请注意,这假设每个要更新的列都是数字,ColumnValue列中的值是数字。

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + 'Update ' + QUOTENAME(TableName) + ' set ' QUOTENAME(ColumnName) + ' = ' + convert(varchar(10), ColumnValue) + ' where AccountNo = ' + convert(varchar(10), AccountNo)
from YourTable

exec sp_executesql @SQL

答案 1 :(得分:0)

这是使用游标的SQL Server方式......

DECLARE @sql NVARCHAR(MAX)

DECLARE c CURSOR FOR
SELECT Query FROM QueryDetails 

OPEN c
FETCH NEXT FROM c INTO @sql

WHILE @@FETCH_STATUS = 0
BEGIN
    exec(@sql)
    FETCH NEXT FROM c INTO @sql
END
CLOSE c
DEALLOCATE c

答案 2 :(得分:0)

您可以使用STUFF函数连接所有查询,然后执行它

假设下面的样本表。

create table #t
(
    AccountNo int,
    TableName varchar(100),
    Query varchar(max)
)

insert into #t values 
(1, 'account', 'update account set balance = 123 where AccountNo = 1'),
(2, 'loan', 'update loan set emi = 1000 where AccountNo = 2')

您可以执行以下所有查询:

declare @sql varchar(max)
set @sql = (SELECT STUFF((SELECT ';' + Query
              FROM #t
              ORDER BY Query
              FOR XML PATH('')), 1, 1, '') AS [Output])
print @sql
exec (@sql)

@sql将包含如下声明:

update account set balance = 123 where AccountNo = 1;update loan set emi = 1000 where AccountNo = 2