如何使用循环动态生成列名?

时间:2016-10-10 15:18:54

标签: sql sql-server loops

我有表Using _stm = _ZipArchiveEntry.Open Image.FromStream(_stm, True, True).Save("C:\test.jpeg", _codec, params) End Using ,它有35列(sdataidnameTRx1TRx2,{{1 },...,TRx3TRx4TRx30city

我想从score列中获取数据。

我可以在这里使用循环吗?

我做了以下代码:

total

我做错了什么?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

如果您的表名是sdata,则此代码应该适合您:

-- Grab the names of all the remaining columns
DECLARE @sql nvarchar(MAX);
DECLARE @columns nvarchar(MAX);
SELECT @columns = STUFF ( ( SELECT N'], [' + name
            FROM sys.columns
           WHERE object_id = (select top 1 object_id FROM sys.objects where name = 'sdata') 
             AND name LIKE 'TRx%' -- To limit which columns
           ORDER BY column_id
             FOR XML PATH('')), 1, 2, '') + ']';
PRINT @columns
SELECT @sql = 'SELECT ' + @columns + ' FROM sdata';
PRINT @sql;
EXEC (@sql);

注意我包含了PRINT语句,因此您可以看到正在发生的事情。您可能希望在测试时注释掉EXEC。

答案 1 :(得分:1)

通过复制/粘贴列名并将其更改为正确的名称,这将更容易实现。 然而如果你必须这样做,我根本不建议使用循环。此方法使用计数表生成要选择的列(在此示例中,列130,但可以更改),然后生成动态SQL语句以对{执行{1}}表:

SData

注意:Declare @From Int = 1, @To Int = 30, @Sql NVarchar (Max) Declare @Columns Table (Col Varchar (255)) ;With Nums As ( Select * From (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As V(N) ), Tally As ( Select Row_Number() Over (Order By (Select Null)) As N From Nums A --10 Cross Join Nums B --100 Cross Join Nums C --1000 ) Insert @Columns Select 'TRx' + Cast(N As Varchar) From Tally Where N Between @From And @To ;With Cols As ( Select ( Select QuoteName(Col) + ',' As [text()] From @Columns For Xml Path ('') ) As Cols ) Select @Sql = 'Select ' + Left(Cols, Len(Cols) - 1) + ' From SData' From Cols --Select @Sql Execute (@Sql) 部分用于在执行之前预览生成的查询。

答案 2 :(得分:0)

您可以选择如下列名称:

SELECT column_name 
FROM information_schema.columns
WHERE table_name = 'my name here'