【问题标题】:Create temp table from comma separated values with more than one column从具有多于一列的逗号分隔值创建临时表
【发布时间】:2014-10-07 16:56:39
【问题描述】:

我正在尝试将逗号分隔的字符串(例如:“101:string1,102:string2”)传递到存储过程中并从中创建一个临时表。临时表将有两列,一是整数,一是字符串。对于此示例,它将有两行。逗号分隔行,冒号分隔两列。有谁知道我该怎么做?我正在使用 sql 服务器。提前致谢!

编辑:顺便说一句,我不是在问如何创建临时表,只是在问如何创建函数。

【问题讨论】:

  • 你确定一个函数是你想要的吗?您不能在函数内创建#temp 表。
  • 您的问题主要是关于创建表还是关于拆分字符串?如果是后者,看看这个问题是否有帮助:stackoverflow.com/questions/9589282/…

标签: sql sql-server


【解决方案1】:

您可以尝试使用Table-Valued Function 代替临时表。像这样的:

CREATE FUNCTION ListToTable
(   
    @list nvarchar(4000)
)
RETURNS @return TABLE 
(
   n int,
   s nvarchar(15)
)
AS
BEGIN
   SET @list = NULLIF(ltrim(rtrim(@list)),'')

   DECLARE @xml AS XML = CAST('<root><row><n>' + 
                              REPLACE(REPLACE(@list,
                                    ',', '</s></row><row><n>'),
                                    ':', '</n><s>') + 
                              '</s></row></root>' AS XML) ;

   INSERT INTO @return (n, s)
      SELECT root.row.value('n[1]', 'int')
           , root.row.value('s[1]', 'nvarchar(4000)')
        FROM @xml.nodes('/root/row') as root(row)

   RETURN
END

用法:

select * from dbo.ListToTable('101:string1,102:string2')

输出:

n           s
----------- ---------------
101         string1
102         string2

【讨论】:

  • 这种不一致是否有原因:n[1]./s[1]?为什么不使用./ 作为前缀,或者避免在这两种情况下都使用前缀?
  • 我修正了不一致的地方。谢谢!我在尝试不同的东西,'./' 是剩下的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 2016-07-23
相关资源
最近更新 更多