我在这里要做的是创建一个动态查询,其中DBA只需要在变量级别更改列名,这是因为我们有多个可怕的创建的DB,即使它们具有相同的数据,列名从一个变为另一个(它们之间没有规范化)。
我正在进行一个查询,它有大约400行,我试图避免的是将逻辑传递给另一个DBA,他们必须通过脚本并替换所有列名...但是只需分配从其DB到逻辑匹配的列名。不确定这是否可能。
这是一个例子:
Declare @ColumnA
Declare @ColumnB
set @ColumnA = 'UserID'
set @ColumnB = 'Salary'
select @ColumnA,@ColumnB from Table
我如何实现这种功能?
答案 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; }
}
如果您有任何疑虑,请告诉我们。