2016-10-05 52 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 

如果您有任何疑问,请让我们知道。