2016-10-05 22 views
2

我在這裏要做的是創建一個動態查詢,其中DBA只需在變量級別更改列名,原因是因爲我們有多個數據庫是可怕的創建,即使他們有相同的數據,列名從一個變到另一個(它們之間沒有規範化)。需要通過變量分配列名SQL

我正在查詢它有大約400行,我試圖避免的是將邏輯傳遞給另一個DBA,他們必須通過該腳本並替換所有列名稱......但相反只是將從其數據庫匹配的列名分配給邏輯。不知道這是否可能。

這是一個例子:

Declare @ColumnA 
Declare @ColumnB 
set @ColumnA = 'UserID' 
set @ColumnB = 'Salary' 

select @ColumnA,@ColumnB from Table 

我怎樣才能實現這種功能?

+0

沒有動態SQL,這是不可能的,我不會推薦將400行查詢轉換爲動態SQL。 Ctrl + H會更容易tbh。 – ZLK

+0

我想知道你如何期待'UserID'被存儲在一個'int'變量中。 :D – Andrew

+0

哈哈你是對的,我只是想說明一點,但我只需要查詢列名,沒有數據.. –

回答

3

您可以使用動態SQL這樣的:

DECLARE @ColumnA nvarchar(max), 
     @ColumnB nvarchar(max), 
     @table nvarchar(max) 
     @sql nvarchar(max) 

SELECT @ColumnA = N'UserID', 
     @ColumnB = N'Salary', 
     @table = N'Table' 

SELECT @sql = N'SELECT ' +QUOTENAME(@ColumnA)+','+QUOTENAME(@ColumnB)+ ' FROM '+QUOTENAME(@table) +';' 

EXEC sp_executesql @sql 

正是在這樣的情況下使用QUOTENAME一個很好的做法,它會救你脫離注射,或空格內列名。

QUOTENAME - 返回一個Unicode字符串,添加了分隔符以使輸入字符串成爲有效的SQL Server分隔標識符。返回nvarchar(258)。因此UserID成爲[UserID]

1

您只需要一個變量並以逗號分隔的形式傳遞所需的列。 然後使用下面的動態腳本獲得預期結果。

DECLARE @Columns nvarchar(max), 
     @sql nvarchar(max) 

SELECT @Columns = N'UserID,Salary' 

SELECT @sql = N'SELECT ' [email protected]+ ' FROM YourTable' 

EXEC sp_executesql @sql 
0

我做了動態查詢。您可以將列和表名稱分配給變量。

  Declare @ColumnA Varchar(50) 
      Declare @ColumnB Varchar(50) 
      Declare @tablename Varchar(50) 

      set @ColumnA = 'UserID' 
      set @ColumnB = 'Salary' 
      set @tablename = '#table' 

      declare @Query nvarchar(max) 

      set @Query='select '[email protected]+','[email protected]+' 
        FROM '[email protected]+' (NOLOCK)' 

      -- print @Query -- to see desired query. 

      execute SP_executesql @Query 

如果您有任何疑問,請讓我們知道。