SQL Server-选择包含查询字符串的列,并将值拆分为其他“列”

SQL Server-选择包含查询字符串的列,并将值拆分为其他“列”,sql,sql-server,Sql,Sql Server,我需要在包含以下查询字符串的列中进行选择: user_id=300&company_id=201503&status=WAITING OPERATION&count=1 我想在一个新列中执行选择并断开每个值,例如: user_id | company_id | status | count 300 | 201503 | WAITING OPERATION | 1 如果不使用procs,如何在SQL Server中执行此操作

我需要在包含以下查询字符串的列中进行选择:

user_id=300&company_id=201503&status=WAITING OPERATION&count=1
我想在一个新列中执行选择并断开每个值,例如:

user_id | company_id | status            | count
300     | 201503     | WAITING OPERATION | 1   
如果不使用procs,如何在SQL Server中执行此操作

我尝试了一个函数:

CREATE FUNCTION [xpto].[SplitGriswold]
(
   @List   NVARCHAR(MAX),
   @Delim1 NCHAR(1),
   @Delim2 NCHAR(1)
)
RETURNS TABLE
AS
  RETURN
  ( 
    SELECT 
      Val1 = PARSENAME(Value,2),
      Val2 = PARSENAME(Value,1)
    FROM 
    (
      SELECT REPLACE(Value, @Delim2, '&') FROM
      ( 
        SELECT LTRIM(RTRIM(SUBSTRING(@List, [Number],
          CHARINDEX(@Delim1, @List + @Delim1, [Number]) - [Number])))
        FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
          FROM sys.all_objects) AS x
          WHERE Number <= LEN(@List)
          AND SUBSTRING(@Delim1 + @List, [Number], LEN(@Delim1)) = @Delim1
       ) AS y(Value)
     ) AS z(Value)
   );
GO
但它只返回一列,其中包含所有内容:

QueryString
user_id=300&company_id=201503&status=WAITING OPERATION&count=1

提前感谢。

您需要在select语句中使用SQL子字符串。首先需要构建第一行,然后使用联合返回第二行

我以前做过很多次,你真幸运!由于每个字符串只有3个分隔符,而且这个数字是固定的,所以可以使用SQL Server的PARSENAME函数来完成此操作。这远没有使用XML解析的最佳选择那么难看。尝试此未测试的查询,用适当的名称替换表名和列名:

SELECT
  PARSENAME(REPLACE(COLUMN_NAME,'&','.'),1) AS 'User',
  PARSENAME(REPLACE(COLUMN_NAME,'&','.'),2) AS 'Company_ID',
  PARSENAME(REPLACE(COLUMN_NAME,'&','.'),3) AS 'Status',
  PARSENAME(REPLACE(COLUMN_NAME,'&','.'),4) AS 'Count',
FROM TABLE_NAME
这将以user_id=300的形式得到结果,这是您想要的最困难的部分。我让你做简单的部分,在=号前把东西放下


注意:我不记得PARSENAME是否会因为非法的名称字符=符号而发疯。如果有,只需在其中嵌套另一个替换,将其转换为其他内容,如下划线。

您的意思是没有内置函数吗?我想您可以使用locate查找user_id=的出现点,然后查找下一个出现的&,对子字符串进行一些有趣的处理,这将非常低效,但我想如果你的字符串中没有任何有趣的content@scragar我会找的。这可能很有用:@Tanner真的很有用,但我需要在同一行中为用户的每一行输入“user\u id”、“company\u id”、“status”和“count”。Logan示例会很有用,因为这对操作没有真正的帮助谢谢你,伙计。很棒的解决方案:乐意帮助!我本应该事先指出我们合同的细则,但你欠我你21岁的孩子。我会等的。
SELECT
  PARSENAME(REPLACE(COLUMN_NAME,'&','.'),1) AS 'User',
  PARSENAME(REPLACE(COLUMN_NAME,'&','.'),2) AS 'Company_ID',
  PARSENAME(REPLACE(COLUMN_NAME,'&','.'),3) AS 'Status',
  PARSENAME(REPLACE(COLUMN_NAME,'&','.'),4) AS 'Count',
FROM TABLE_NAME