是否可以进行动态声明?
我会解释一下:我有一张表COLUMNAMES
:
ID|Name
1|Country
2|City
3|District
4|Neighbourhood
对于该表中的每条记录,我想做类似的事情:
declare @i int = 1
declare @number int
set @number = (SELECT count(*) FROM COLUMNNAMES)
While @i <= @number
BEGIN
Execute ('Declare column' + @i +'varchar(25)')
Execute ('set column' + @i +' = (Select NAME from COLUMNAMES where id = ' + @i)
set @i = @i + 1
END
我的想法是获得一个变量列表(字符串),我可以用它来创建带有动态表别名的SELECT语句:
Execute ('Select SOMECOLUMN as ' + @columname + @i +', ANOTHERCOLUMN as ' + @columname + @i +', ATHIRDCOLUMN as ' + @columname + @i + ' FROM SOMETABLE')
可以这样做吗?如果是这样,怎么样?
答案 0 :(得分:1)
不,您不能声明这样的变量,但您可以使用填充了数据的临时表。
这是一些帮助,但它不是一个完整的解决方案,只是一个想法,你可以做什么而不是不工作的声明:
Create Table #ColumnNames(
NAME varchar(64)
)
While @i <= @number
BEGIN
INSERT INTO #ColumNames
Select NAME from COLUMNAMES where id = @i
set @i = @i + 1
END
DECLARE @Columns varchar(max)
SET @Columns = ''
SElECT @Columns = @Columns + NAME + ', '
FROM #ColumNames
答案 1 :(得分:1)
每个Execute
作为不同的会话发挥作用。
因此,为了声明变量,所有代码必须在一个Execute
函数中。
答案 2 :(得分:0)
这不是一个完整的解决方案,而是一个方向。您需要动态地获取值'SomeColumn',可能就像您在下面的解决方案中获取别名一样。
declare @i int = 1
declare @number INT
DECLARE @ColName VARCHAR(25)
DECLARE @SQL VARCHAR(4000)=''
DECLARE @ColumnsWithAlias VARCHAR(4000) = ''
set @number = (SELECT count(*) FROM COLUMNNAMES)
While @i <= @number
BEGIN
Select @ColName= NAME from COLUMNAMES where id = @i)
SET @ColumnsWithAlias =@ColumnsWithAlias + 'SomeColumn'+ ' AS '+ @ColName + ' , '
set @i = @i + 1
END
SET @SQL= 'SELECT '@ColumnsWithAlias+' FROM TableName'
EXECUTE(@SQL)