强制输出查询显示一次 DB_NAME() 数据

Force the output query to shows the DB_NAME() data once

我有一个查询 selects 来自 table 的所有索引并生成输出文本以单独删除它们。

我想把DB_NAME()信息放在命令的开头一次,但此时数据在每个索引下降时显示。

我之前试过放一个select,但是没有成功。

有人可以帮助我吗?查询及结果如下:

- 查询

SELECT
  'USE ' + QUOTENAME(db_name()) + ';' + CHAR(13) +
  'GO ' + CHAR(13) +
  'DROP INDEX ' + QUOTENAME(i.name) + ' ON ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.Name) + ';' + CHAR(13) +
  'GO'
FROM
  sys.indexes i
  JOIN sys.tables t ON t.object_id = i.object_id
  JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE
  t.Name = 'Queue';

- 我得到的结果(示例)

USE [master];
GO 
DROP INDEX [PK_Queue] ON [dbo].[Queue];
GO
USE [master];
GO 
DROP INDEX [I_001] ON [dbo].[Queue];
GO
USE [master];
GO 
DROP INDEX [I_002] ON [dbo].[Queue];
GO

-我想要的结果

USE [master];
GO 
DROP INDEX [PK_Queue] ON [dbo].[Queue];
GO
DROP INDEX [I_001] ON [dbo].[Queue];
GO
DROP INDEX [I_002] ON [dbo].[Queue];
GO
SELECT Txt
from
(
    SELECT
      1 as Seq,
      'USE ' + QUOTENAME(db_name()) + ';' + CHAR(13) +
      'GO ' + CHAR(13) as Txt
    union all
    SELECT
       2 as Seq,
      'DROP INDEX ' + QUOTENAME(i.name) + ' ON ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.Name) + ';' + CHAR(13) +
      'GO'
    FROM
      sys.indexes i
      JOIN sys.tables t ON t.object_id = i.object_id
      JOIN sys.schemas s ON s.schema_id = t.schema_id
    WHERE
      t.Name = 'Queue'
) S1
order by Seq

但是,何必呢?正如@shreepat18 所说,您可以在 SQL Server Management Studio 中编写几乎所有内容!

您可以只使用 USE 命令初始化一个变量,然后使用字符串连接附加 DROP INDEX 命令。这在 SQL Server 2017 (STRING_AGG()) 中更容易,但您没有告诉我们您使用的是什么版本,所以...

DECLARE @sql nvarchar(max) = N'USE ' + QUOTENAME(db_name()) + ';';

SELECT @sql += char(13) + N'GO' + char(13) + N'DROP INDEX ' 
  + QUOTENAME(i.name) + ' ON ' + QUOTENAME(s.name) 
  + '.' + QUOTENAME(t.name) + ';' + CHAR(13)
FROM
  sys.indexes i
  JOIN sys.tables t ON t.object_id = i.object_id
  JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE
  t.Name = 'Queue' AND i.name IS NOT NULL;
  
 PRINT @sql;