需要通过变量SQL

时间:2016-10-05 03:58:56

标签: sql sql-server tsql dynamic-sql

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

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

这是一个例子:

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

select @ColumnA,@ColumnB from Table

我如何实现这种功能?

3 个答案:

答案 0 :(得分:3)

您可以像这样使用动态SQL:

fswatch

在这种情况下使用QUOTENAME是一种很好的做法,它可以避免注射或列名称中的空格。

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 - 返回添加了分隔符的Unicode字符串,以使输入字符串成为有效的SQL Server分隔标识符。返回QUOTENAME。因此nvarchar(258)成了UserID

答案 1 :(得分:1)

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

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

SELECT  @Columns = N'UserID,Salary'

SELECT @sql = N'SELECT ' +@Columns+ ' FROM YourTable'

EXEC sp_executesql @sql

答案 2 :(得分:0)

我做了动态查询。您可以将列和表名称分配给变量。

    public class People
    {
        [JsonProperty(PropertyName ="name")]
        public string Name { get; set; }
        [JsonProperty(PropertyName = "address")]
        public string  Address { get; set; }
    }

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