sql中的动态声明

时间:2012-08-30 14:28:58

标签: sql sql-server sql-server-2008 tsql

是否可以进行动态声明? 我会解释一下:我有一张表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')

可以这样做吗?如果是这样,怎么样?

3 个答案:

答案 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)