【问题标题】:SQL Query Into Delimited String In Stored ProcedureSQL查询到存储过程中的分隔字符串
【发布时间】:2013-08-20 19:51:51
【问题描述】:

我有桌子:

CREATE TABLE [address_tabletype] (
[CONTROL_NUMBER] [varchar](12) NULL,
[ADDRESS1] [varchar](50) NULL,
[ADDRESS2] [varchar](50) NULL,
[CITY] [varchar](50) NULL,
[STATE] [varchar](2) NULL,
[ZIP] [varchar](10) NULL
)
GO

并且,假设我有以下行:

2506387 1   2   3   4   5
2506394 1   2   3   4   5
2506403 1   2   3   4   5

我想看起来像:

2506387|1|2|3|4|5~2506394|1|2|3|4|5~2506403|1|2|3|4|5

我什么都没试过,因为我真的不知道从哪里开始。

我正在使用 SQL Server 2008 R2,并将使用临时表来构建此字符串。

编辑

我正在使用它传递给第 3 方 CLR 函数,该函数绝对需要以这种方式分隔字符串。我计划将它发送给函数,将其返回给 SP,将其分解为原始形式,然后将结果返回给 SP 的调用者。

谢谢。

【问题讨论】:

  • 您是从数据库中提取这些信息吗?我问是因为一旦从数据库中提取这些字符串,操作起来会容易得多。
  • 是的。这是在一个存储过程中,它将接受使用表定义构建的选择语句。我尝试了 1000 种不同的方法来达到这一点,这是我的环境中唯一适用的解决方案。
  • 如果|~ 恰好出现在数据中,您是否有转义或编码的计划?
  • 我计划在创建此字符串之前删除不需要/不必要/有害的字符。

标签: sql sql-server stored-procedures concatenation delimiter


【解决方案1】:

尝试以下操作:

SELECT STUFF((select (
    SELECT  '~' + (
        CONTROL_NUMBER+'|'+
        ADDRESS1 +'|'+
        ADDRESS2 + '|'+
        CITY + '|'+
        [States] + '|'+
        ZIP)
    FROM address_tabletype
    FOR XML PATH(''), type
    ).value('text()[1]', 'varchar(max)')), 1, 1, '')

【讨论】:

  • 哇,这令人印象深刻。非常好+1。我看过你之前提交的,都是A级。
  • 有没有比 Varchar(Max) 大的东西?我知道这是一个巨大的价值,但我只使用这种方法在每个块中压缩了大约 3500 个地址。
  • varchar(max) 最多可以容纳 ~2Gb,尽管从这个主题 (link) 看来,在 SqlServer 2008(可能及以后)variable(不是列) 可以容纳更多。您的地址记录的大小不太可能每个约为 0.6Mb (2Gb/3500)。所以,我猜for xml 中可能存在一些限制。在这种情况下,您可以尝试小批量连接,例如一次循环 3000 行。请参阅 SQLFiddle (link) 上的示例。
【解决方案2】:

基本上我会在你的 SP 中使用这样的东西:

声明你的临时表变量,注意添加你想要的所有字段:

declare @rowsToConcat table ([ID] int identity(1,1),[CONTROL_NUMBER] varchar(12), ...repeat for all of your fields)

insert into @rowsToConcat
    select * from [address_tabletype]
declare @loopcnt int
declare @concat_output as varchar(1000)
set @loopcnt = 1
while(@loopcnt < (select max([ID]) from @rowsToConcat))
begin
    select @concat_output = @concat_output + [CONTROL_NUMBER] + '|' + [..all other fields] + '~'
    from @rowsToConcat 
    where [ID] = @loopcnt
    set @loopcnt = @loopcnt+1
end

只是在这里没有测试就输入了这个,我没有填写你所有的字段,而是把..所有其他字段让你重复。我使用这种技术对我很有用。也没有测试,但如果您不知道预期有多少结果,您可能希望将 @concat_output 设为 varchar(max)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2017-06-05
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2011-12-24
    相关资源
    最近更新 更多