繁体   English   中英

将SQL中的值列表转换为CTE或临时表

[英]Convert list of values in SQL to CTE or Temp Table

如何将诸如(value1,value2,value3,....,value500)之类的值列表转换为临时表或CTE?

一种方法是:

WITH huge_list_cte AS (
   Select value1
   UNION
   Select value2 ...
)

有没有更好的办法?

使用values

WITH huge_list_cte AS (
      SELECT v
      FROM (VALUES (value1), (value2), . . . ) v(v)
     )
. . .

您可以使用table变量

DECLARE @Data TABLE(Id INT);
INSERT INTO @Data VALUES (101), (102) ...

然后,您可以在查询中将其用作普通表

SELECT * FROM @Data

您甚至可以创建预定义的表类型并重新使用它, Microsoft Docs:table

假设您有一个值列表(值1,值2,...值500)作为一个巨大的字符串。您可以先将其分配给变量,然后使用拆分列表类型的函数,然后将变量传递给该函数。

这就是你可以使用它的方式

declare @input varchar(max) = ('value1,value2,value3,value499,value500')
select * from dbo.SplitList (@input,',')

我使用的功能是这样的:

create FUNCTION [dbo].[SplitList](@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (value nvarchar(4000))
AS
--this function takes two parameters; the first is the delimited string, the second is the delimiter

    BEGIN
    DECLARE @INDEX INT
    DECLARE @SLICE nvarchar(4000)
    -- HAVE TO SET TO 1 SO IT DOESNT EQUAL Z
    --     ERO FIRST TIME IN LOOP
    SELECT @INDEX = 1

    IF @String IS NULL RETURN
    WHILE @INDEX !=0


        BEGIN    
            -- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
            SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
            -- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
            IF @INDEX !=0
                SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
            ELSE
                SELECT @SLICE = @STRING
            -- PUT THE ITEM INTO THE RESULTS SET
            INSERT INTO @Results(value) VALUES(@SLICE)
            -- CHOP THE ITEM REMOVED OFF THE MAIN STRING
            SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
            -- BREAK OUT IF WE ARE DONE
            IF LEN(@STRING) = 0 BREAK
    END

    RETURN
END

这将返回一个包含所有值的表。

暂无
暂无

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

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