Sql-Server

動態SQL從表中選擇所有列的優化方式是什麼?

  • September 10, 2018

我剛剛生成了這個腳本。它將動態地從表中選擇所有列。

是否有替代或更清潔、有效的方式來執行此操作?另外,我想為每一列放置換行符;char(10) 和 char(13) 不起作用。

declare @Tablename nvarchar(max) = 'dbo.customer'

DECLARE @qry NVARCHAR(MAX) =
'SELECT ' + STUFF((
   SELECT ', ' + char(10) + char(13) + QUOTENAME(c.name) 
   FROM sys.columns c where c.object_id = object_id(@Tablename)
   FOR XML PATH(''), TYPE).value('.','nvarchar(max)'),1,2,'') +
' FROM ' + @Tablename
;

select @qry

目前結果

SELECT [customerid], [customernamename] FROM dbo.customer

預期結果:

SELECT 
[customerid], 
[customernamename] 
FROM dbo.customer

我不確定是否有更有效的方法來檢索列列表,但我將使用以下範例解決換行問題(我將您的 char(10) + char(13) 反轉為 char(13 ) + 字元 (10)。

DROP TABLE IF EXISTS dbo.Customers;
CREATE TABLE [dbo].[Customers](
   [CustomerID] [int] NULL,
   [CustomerName] [varchar](50) NULL
) ON [PRIMARY]
GO

declare @Tablename nvarchar(max) = 'dbo.customers'

DECLARE @qry NVARCHAR(MAX) =
'SELECT ' + STUFF((
   SELECT ', ' + char(13) + char(10) + QUOTENAME(c.name) 
   FROM sys.columns c where c.object_id = object_id(@Tablename)
   FOR XML PATH(''), TYPE).value('.','nvarchar(max)'),1,2,'') +
 + char(13) + char(10) + 'FROM ' + @Tablename
;

select @qry

SELECT 
[CustomerID], 
[CustomerName]
FROM dbo.customers

您可以將 SSMS 輸出更改為文本,或者,如果您更喜歡網格視圖,請確保執行以下操作:

  1. 工具 > 選項
  2. 展開查詢結果 > SQL Server > 結果到網格
  3. 勾選 Retain CR/LF on copy or save
  4. 重啟 SSMS

引用自:https://dba.stackexchange.com/questions/217129