【问题标题】:Execute SELECT-resulted statements执行 SELECT 产生的语句
【发布时间】:2017-02-15 18:40:22
【问题描述】:

我一直在寻找有关如何执行我存储在具有 SELECT 语句结果的表中的语句的几个小时。

我发现了类似的问题,但没有一个有效。

所以现在我有一个表格,其中第一列的单元格包含

DROP TABLE table1
DROP TABLE table2
..... and so on. 

我尝试过使用EXEC 命令,但无法正常工作。

请帮忙。谢谢你。

【问题讨论】:

  • 您为什么要这样做?似乎是个坏主意。
  • 我读到它的安全性很差,但它不会被重用。我只需要从具有特定特征的数据库中删除表。

标签: sql sql-server database


【解决方案1】:

如果你想执行所有语句,我认为你需要实现一个游标

DECLARE @Query VARCHAR(250)

DECLARE crs_ExecStatement CURSOR FAST_FORWARD
FOR 
    SELECT Column1 FROM YourTable 

OPEN crs_ExecStatement
    FETCH NEXT FROM crs_ExecStatement INTO @Query
    WHILE @@FETCH_STATUS = 0
    BEGIN 
        EXEC(@Query)

        FETCH NEXT FROM crs_ExecStatement INTO @Query
    END

CLOSE crs_ExecStatement
DEALLOCATE crs_ExecStatement

【讨论】:

  • 光标正在扼杀性能,请按照我的回答,以获得比光标更友好的另一个解决方案
  • 表中有多少条记录,您将多久执行一次这些命令?将游标声明为 FAST_FORWARD 会获得更好的性能
  • 如果您对游标和性能之间的关系有任何疑问,只需对这两种方法使用执行计划,让 SQL Server 引擎说出来。
  • 我对此没有任何疑问,我只是说如果它不需要经常执行并且对于非常大量的记录,那么性能成本并不是很重要.
  • SQL Server 引擎说:你错了,我使用了执行计划,成本是31%,没有光标是10%
【解决方案2】:

使用EXEC 并用GO 分隔值作为下一个演示:-

Create database Demo
go
use Demo
go

Create table MyTable (Value varchar (200))
go
insert into MyTable values ('Drop Table table1')
go
insert into MyTable values ('Drop Table table2')
go
insert into MyTable values ('Drop Table table3')
go

declare @Query nvarchar(max)
SELECT @Query = isnull(@Query,'') + Value + char (10) + 'Go'
FROM MyTable 
--print @Query
SET @Query = 'EXEC (''' + REPLACE(REPLACE(@Query, '''', ''''''), 'GO', '''); EXEC(''') + ''');'
EXEC (@Query)

使用go 执行动态查询的想法取自here

【讨论】:

  • 代码已经过测试!请确认您使用的是同一个数据库!
  • 我刚刚意识到我犯了一个错误 - 我没有在每个值之后使用 go,因为我使用 select 语句将值插入到表中。
猜你喜欢
  • 1970-01-01
  • 2013-08-11
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2016-09-11
相关资源
最近更新 更多