如何转换值列表,如(value1,value2,value3,....,value500) 到临时表或cte?
一种方法是:
WITH huge_list_cte AS (
Select value1
UNION
Select value2 ...
)
有更好的方法吗?
答案 0 :(得分:1)
使用values
:
WITH huge_list_cte AS (
SELECT v
FROM (VALUES (value1), (value2), . . . ) v(v)
)
. . .
答案 1 :(得分:1)
您可以使用table
变量
DECLARE @Data TABLE(Id INT);
INSERT INTO @Data VALUES (101), (102) ...
然后您可以在查询中将其用作普通表
SELECT * FROM @Data
您甚至可以创建预定义的表格类型并重复使用Microsoft Docs: table
答案 2 :(得分:0)
假设你有一个值列表(value1,value2,... value500)作为一个巨大的字符串.. 您可以先将其分配给变量,然后使用拆分列表类型的函数,然后将变量传递给函数。
这就是你如何使用它
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
这将返回一个包含所有值的表。