gpt4 book ai didi

sql-server-2008 - 对多列使用 CROSS APPLY

转载 作者:行者123 更新时间:2023-12-02 22:04:20 25 4
gpt4 key购买 nike

第 3 天使用 SQL Server。

我正在尝试将 2 列分隔数据合并到表值函数的一个输出中。这是我的数据:

enter image description here

我希望按以下格式处理数据并将其放入表中:

enter image description here

我目前正在尝试使用这个 CROSS APPLY TSQL 语句,但我不知道我在做什么。

USE [Metrics]
INSERT INTO dbo.tblSplitData(SplitKey, SplitString, SplitValues)
SELECT d.RawKey, c.*, e.*
FROM dbo.tblRawData d
CROSS APPLY dbo.splitstringcomma(d.DelimitedString) c, dbo.splitstringcomma(d.DelimitedValues) e

我对 CROSS APPLY 的研究具有广泛的背景,我不明白在这种情况下应该如何应用它。我是否需要一个带有附加 CROSS APPLY 的子查询和一个连接来组合两个表值函数的返回值?

这是我最初使用的 split 函数(我不记得作者对它们的信任):

CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @Delimiter CHAR(1))
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN

DECLARE @name NVARCHAR(255)
DECLARE @pos INT

WHILE CHARINDEX(@Delimiter, @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(@Delimiter, @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

INSERT INTO @returnList
SELECT @name

SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END

INSERT INTO @returnList
SELECT @stringToSplit

RETURN
END

编辑和修改查询

USE [Metrics] 
INSERT INTO dbo.tblSplitData(SplitKey, SplitString, SplitValues)
SELECT s.RawKey, s.SplitString, v.SplitValues
FROM (
SELECT d.RawKey, d.DelimitedString,
c.item SplitString, c.rn
FROM dbo.tblRawData d
CROSS APPLY dbo.splitstring(d.DelimitedString, ',') c
) s

INNER JOIN

(
SELECT d.RawKey, d.DelimitedValues,
c.item SplitValues, c.rn
FROM dbo.tblRawData d
CROSS APPLY dbo.splitstring(d.DelimitedValues, ',') c
) v
on s.RawKey = v.RawKey
and s.rn = v.rn;

最佳答案

如果我们能看到您的拆分字符串函数,可能会更容易回答这个问题。我的答案是使用我拥有的拆分函数的一个版本。

我会在您的拆分函数中包含一个行号,您可以使用它来连接拆分字符串和拆分值。

拆分功能:

CREATE FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))       
returns @temptable TABLE (items varchar(MAX), rn int)
as
begin
declare @idx int
declare @slice varchar(8000)
declare @rn int = 1 -- row number that increments with each value in the delimited string

select @idx = 1
if len(@String)<1 or @String is null return

while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String

if(len(@slice)>0)
insert into @temptable(Items, rn) values(@slice, @rn)

set @String = right(@String,len(@String) - @idx)
set @rn = @rn +1

if len(@String) = 0 break
end
return
end;

然后如果您有多个列要拆分,您可以使用类似于以下的查询:

INSERT INTO dbo.tblSplitData(SplitKey, SplitString, SplitValues)
select s.rawkey,
s.splitstring,
v.splitvalues
from
(
SELECT d.RawKey, d.delimitedstring, d.delimitedvalues,
c.items SplitString,
c.rn
FROM dbo.tblRawData d
CROSS APPLY dbo.Split(d.DelimitedString, ',') c
) s
inner join
(
SELECT d.RawKey, d.delimitedstring, d.delimitedvalues,
c.items SplitValues,
c.rn
FROM dbo.tblRawData d
CROSS APPLY dbo.Split(d.DelimitedValues, ',') c
) v
on s.rawkey = v.rawkey
and s.delimitedstring = v.delimitedstring
and s.rn = v.rn;

参见 SQL Fiddle with Demo

这使用两个生成拆分值列表的子查询,然后使用拆分函数创建的行号将它们连接起来。

关于sql-server-2008 - 对多列使用 CROSS APPLY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16362318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com