我正在编写一个游标以从主表中填充新表中的数据,其中包含以下方式的数据
物品 | 颜色 |
---|---|
衬衫 | 红、蓝、绿、黄 |
我想通过获取项目然后将其添加到行中来填充新的表数据,根据它包含的每种颜色
物品 | 颜色 |
---|---|
衬衫 | 红色的 |
衬衫 | 蓝色的 |
衬衫 | 绿 |
衬衫 | 黄色的 |
我被困在如何
- 分隔/拆分“颜色”字符串
- 将其保存在数组中
- 在光标中使用它
因为我将为此目的使用嵌套游标。
我正在编写一个游标以从主表中填充新表中的数据,其中包含以下方式的数据
物品 | 颜色 |
---|---|
衬衫 | 红、蓝、绿、黄 |
我想通过获取项目然后将其添加到行中来填充新的表数据,根据它包含的每种颜色
物品 | 颜色 |
---|---|
衬衫 | 红色的 |
衬衫 | 蓝色的 |
衬衫 | 绿 |
衬衫 | 黄色的 |
我被困在如何
因为我将为此目的使用嵌套游标。
使用 Sql Server 2005+ 和 XML 数据类型,您可以查看以下内容
DECLARE @Table TABLE(
Item VARCHAR(250),
Colors VARCHAR(250)
)
INSERT INTO @Table SELECT 'Shirt','Red,Blue,Green,Yellow'
INSERT INTO @Table SELECT 'Pants','Black,White'
;WITH Vals AS (
SELECT Item,
CAST('<d>' + REPLACE(Colors, ',', '</d><d>') + '</d>' AS XML) XmlColumn
FROM @Table
)
SELECT Vals.Item,
C.value('.','varchar(max)') ColumnValue
FROM Vals
CROSS APPLY Vals.XmlColumn.nodes('/d') AS T(C)
文章在 Transact SQL 中伪造数组详细介绍了解决此问题的几种技术,从使用 PARSENAME() 函数(限制为 5 项)到编写 CLR 函数。
XML 答案是可以针对特定场景选择的详细技术之一。
结合一些技巧,我解决了我的字符串拆分问题,如下所示:
SET NOCOUNT ON;
DECLARE @p NVARCHAR(1000), @len INT;
SET @p = N'value 1,value 2,value 3,value 4,etc';
SET @p = ',' + @p + ',';
SET @len = LEN(@p);
-- Remove this table variable creation if you have a permanent enumeration table
DECLARE @nums TABLE (n int);
INSERT INTO @nums (n)
SELECT A.n FROM
(SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY TableKey) as n FROM dbo.Table) A
WHERE A.n BETWEEN 1 AND @len;
SELECT SUBSTRING(@p , n + 1, CHARINDEX( ',', @p, n + 1 ) - n - 1 ) AS "value"
FROM @nums
WHERE SUBSTRING( @p, n, 1 ) = ',' AND n < @len;
请注意,考虑到您的字符串长度限制为 1000,您必须有一个包含 1000 或更多行的表(示例 tsql 上的 dbo.Table)才能创建此示例的表变量 @nums。在文章中,他们有一个永久的枚举表。
对于那些喜欢保持简单的人:
-- Here is the String Array you want to convert to a Table
declare @StringArray varchar(max)
set @StringArray = 'First item,Second item,Third item';
-- Here is the table which is going to contain the rows of each item in the String array
declare @@mytable table (EachItem varchar(50))
-- Just create a select statement appending UNION ALL to each one of the item in the array
set @StringArray = 'select ''' + replace(@StringArray, ',', ''' union all select ''') + ''''
-- Push the data into your table
insert into @@mytable exec (@StringArray)
-- You now have the data in an an array inside a table that you can join to other objects
select * from @@mytable
我刚刚完成了这样的事情来创建临时表以使用链接服务器上的 INFORMATION_SCHEMA 视图复制源表。但这是一个修改版本,用于创建您正在寻找的结果。只需记住在显示颜色列时删除最后两个字符。
SELECT
t.Item
, (
SELECT
x.Color + ', ' AS [data()]
FROM
Items x
WHERE
x.Item = t.Item
FOR XML PATH(''), TYPE
).value('.', 'varchar(max)') AS Colors
FROM
Items t
GROUP BY
t.Item