首页 > 解决方案 > SQL Server 循环到表

问题描述

所以我收到了以下代码,并被要求将其重写为表格:

USE [Database_name]

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER procedure [dbo].[DumLoop]
AS

SET nocount ON
IF OBJECT_ID('dbo.DummyLoopy','U') IS NOT NULL DROP TABLE dbo.DummyLoopy
create table dbo.DummyLoopy
(value VARCHAR(1000))

DECLARE
@Counter INT = 1
,@MaxInteger INT =   ((select count(*) from  dbo.OUTPUT_DEF))
,@MaxInteger_2 INT = ((select count(*) from  dbo.OUTPUT_DEF))
,@MaxInteger_3 INT = ((select count(*) from  dbo.OUTPUT_DEF))
,@MaxInteger_4 INT = (select count(*) from  dbo.OUTPUT_TABLE)
,@MyNumber NVARCHAR(100)
,@JustAChar NVARCHAR (100)
,@SecondRow NVARCHAR(500)
,@1 NVARCHAR(100)
,@2 NVARCHAR(100)
,@3 NVARCHAR(100)

WHILE(@Counter <= @MaxInteger)
BEGIN

   SELECT 
   @MyNumber = convert(varchar(100))
   ,@JustAChar = '&'
   ,@SecondRow = '{8181:ABC12345' + convert(varchar(100), [ID]) + '}{123:45678}{LALA:'

   ,@1      = ':2020:' + '123456789' + convert(varchar(100), [ID])
   ,@2      = ':2323:ZUP'
   ,@3      = ':3333:1111' + convert(varchar(100), [ID]) + ',123'

FROM  dbo.OUTPUT_TABLE
WHERE main.[ID] = @Counter  

    insert into dbo.DummyLoopy Values('')
    insert into dbo.DummyLoopy Values(@JustAChar)
    insert into dbo.DummyLoopy Values(@SecondRow)
    insert into dbo.DummyLoopy Values(@1)
    insert into dbo.DummyLoopy Values(@2)
    insert into dbo.DummyLoopy Values(@3)

   SET @Counter  = @Counter
END

所以这只是将每个值写入换行符并创建一个只有一列的表 - 列值。我也希望它把每个值都写成一个新列。我什至不知道该怎么做。

输出将类似于:

&
:2020:1234567891
:2323:ZUP
:3333:11111,123

&
:2020:1234567892
:2323:ZUP
:3333:11112,123

&
:2020:1234567893
:2323:ZUP
:3333:11113,123

etc.

标签: sqlsql-server

解决方案


您可以使用 pivot 在最终输出中将行转换为列,而不是为每个值物理创建新列。以下链接可以帮助您。

在sql server中有效地将行转换为列

如果必须要求在 while 循环中为每个新值物理创建新列,那么实现此目的的一种方法是使用动态 SQL 命令。

在 SQL Server 中执行动态 SQL 命令


推荐阅读