简体   繁体   English

SQL Server循环到表

[英]SQL Server loop to table

so I have received the following piece of code and am asked to rewrite it as a table: 因此,我收到了以下代码,并被要求将其重写为表格:

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

So this just writes every value on a newline and creates a table with only one column - the column value. 因此,这只是将每个值写在换行符上,并创建仅包含一列的表-列值。 I would like it also to write away every value as a new column. 我也希望将每个值都写为新列。 I don't even know how to go about it. 我什至不知道该怎么做。

Output would then look something like: 输出将如下所示:

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

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

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

etc.

You can use pivot to convert rows to columns in your final output instead of physically creating new columns for every value. 您可以使用数据透视表将行转换为最终输出中的列,而不必为每个值实际创建新列。 Following link can help you out. 以下链接可以帮助您。

Efficiently convert rows to columns in sql server 在SQL Server中将行有效地转换为列

If there is a must requirement to physically create new columns for every new value in while loop, then one way to achieve that is to use dynamic SQL commands. 如果必须为while循环中的每个新值物理创建新列,那么一种实现方法是使用动态SQL命令。

Execute Dynamic SQL commands in SQL Server 在SQL Server中执行动态SQL命令

you could do this : 你可以这样做:

DECLARE 
    @Counter     INT = 1
,   @ID          INT
,   @MaxInteger  INT 

IF OBJECT_ID('TempDB..#ID') IS NOT NULL
DROP TABLE #ID

SELECT
    ROW_NUMBER() OVER(ORDER BY ID) AS RN
,   ID 
INTO #ID 
FROM 
    dbo.OUTPUT_TABLE

IF OBJECT_ID('TempDB..#DummyLoopy') IS NOT NULL
DROP TABLE #DummyLoopy

CREATE TABLE #DummyLoopy([value] VARCHAR(1000)) 


SET @MaxInteger = (SELECT MAX(RN) FROM #ID) 

WHILE @Counter <= @MaxInteger
BEGIN 

    SET @ID = (SELECT ID FROM #ID WHERE RN = @Counter)

    INSERT INTO #DummyLoopy 
    VALUES  
        (' '),
        ('&'),
        ('{8181:ABC12345' + CONVERT(VARCHAR(100), @ID) + '}{123:45678}{LALA:'), 
        (':2020:' + '123456789' + CONVERT(VARCHAR(100), @ID)), 
        (':2323:ZUP'),
        (':3333:1111' + CONVERT(VARCHAR(100), @ID) + ',123')

    SET @Counter = @Counter + 1
END 

SELECT * FROM #DummyLoopy 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM