TSQL 在执行前生成动态 SQL 语句

TSQL to generate the dynamic SQL statement before execution

如果我有一个列名列表 a,b,c 是否可以生成 SQL 语句作为 string(在 EXEC 中作为动态 SQL) 基于该列名称中的项目数。

所以,如果我有一个名为 @src

的 table
DECLARE @src AS TABLE
  (
     list VARCHAR(max)
  )

INSERT INTO @src
SELECT 'a'
UNION
SELECT 'b'
UNION
SELECT 'c'

SELECT *
FROM   @src 

如何动态生成一个字符串for each element in @src给一个字符串a,b,c 它将在 EXEC 语句中进一步使用,例如 EXEC('select'+a,b,c(coming from dynamic string)+'from mainTbl

使用 javascript 字符串生成器更好地演示这一点

var src = ['a','b','c'];
var target =['e','f','g'];
var beginning ='select';
var end = 'from mainTbl';
var newArray=[];
src.forEach((x,i,r)=>{newArray.push(x+' '+'as '+target[i]);});
var dynamicStr = beginning+' '+newArray.reduce(function(prev,current){return prev+', '+current;})+' '+end; //to be utilized inside SQL EXEC

这在 javascript 中,但 TSQL 是否可以为 @src 的每个元素生成此字符串,以便每当我编辑 @src 最终结果动态变化。

如果我理解正确的话,您似乎只需要聚合“列”即可。

在 SQLServer 2017+ 中你可以使用 string_agg()

SELECT Concat('select ', String_Agg(quotename(list),', '), ' from t')
FROM   @src

在 2017 年之前,您可以对 xml 路径 语法

使用更笨重的
select Concat('select ', 
    Stuff((
    select ', ' + QuoteName(list) 
    from @src
    for xml path(''), type).value('text()[1]','nvarchar(max)'), 1, len(', '), ''),
    ' from t'
) as statement