【问题标题】:Need to assign a Column name through a variable SQL需要通过一个变量 SQL 来分配一个列名
【发布时间】:2017-02-13 09:09:34
【问题描述】:

我在这里要做的是创建一个动态查询,其中 DBA 只需在变量级别更改列名,原因是我们有多个被可怕地创建的 DB,即使它们具有相同的数据,列名称从一个更改为另一个(它们之间没有规范化)。

我正在处理一个大约有 400 行的查询,我试图避免将逻辑传递给另一个 DBA,在那里他们必须通过脚本并替换所有列名......但只是分配从数据库匹配到逻辑的列名。不确定这是否可能。

这是一个例子:

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

select @ColumnA,@ColumnB from Table

我怎样才能实现这种功能?

【问题讨论】:

  • 如果没有动态 SQL,这是不可能的,我不建议将 400 行查询转换为动态 SQL。 Ctrl+H 会容易很多。
  • 我想知道您如何期望 'UserID' 存储在 int 变量中。 :D
  • 哈哈你是对的,我只是想说明一点,但我只需要查询来查看列名,不需要数据..
  • @Andrew:没有理由 UserId 不能是 int。
  • @ Mitch,Andrew 有一点,我删除了数据类型,因为我需要保留列名,而不是数据类型。如果这在事实是可能的

标签: sql sql-server tsql dynamic-sql


【解决方案1】:

您可以像这样使用动态 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]

【讨论】:

    【解决方案2】:

    您只需要一个变量并将所需的列以逗号分隔传递。 然后使用下面的动态脚本来获得预期的结果。

    DECLARE @Columns nvarchar(max),
            @sql nvarchar(max)
    
    SELECT  @Columns = N'UserID,Salary'
    
    SELECT @sql = N'SELECT ' +@Columns+ ' FROM YourTable'
    
    EXEC sp_executesql @sql
    

    【讨论】:

      【解决方案3】:

      我做了一个动态查询。您可以为变量分配列名和表名。

                  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 '+@ColumnA+','+@ColumnB+'
                          FROM '+@tablename+' (NOLOCK)'
      
                  -- print @Query  -- to see desired query.
      
                  execute SP_executesql  @Query 
      

      如果您有任何疑问,请告诉我们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        相关资源
        最近更新 更多