1

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

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

4

3 回答 3

2

每个Execute功能都作为不同的会话。

因此,为了声明变量,所有代码都必须在一个Execute函数中。

于 2012-08-30T14:35:19.257 回答
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
于 2012-08-30T14:32:48.230 回答
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) 
于 2012-08-30T15:30:25.930 回答