0

我有一个像这样的查询:

SELECT ...
FROM ...
WHERE .. AND SomeID = @someID

我继承了这个包含一些动态元素的大型存储过程,所以我需要从另一个表的列中获取 someID 的值,即执行查找。

我怎样才能做到这一点?

另一列如下所示:

TypeValue
'SomeID=1232,OtherID=3383'

某些列 TypeValue 是 VARCHAR(1000),它包含一个逗号分隔的类型和值对字符串。

所以我需要拆分,,然后拆分,=所以以某种方式得到:

SET @SomeID = SELECT TypeValue FROM MyTABLE WHERE ..

我怎样才能做到这一点?

(注意,这是 sql server 2000)

4

3 回答 3

1

假设你被糟糕的设计困住了,这不需要动态 SQL:

USE tempdb;
GO

CREATE TABLE dbo.foo(ID INT, TypeValue VARCHAR(1000));

INSERT dbo.foo SELECT 1, 'SomeID=1232,OtherID=3383';
INSERT dbo.foo SELECT 2, 'Blat=prong,SomeID=1254';
INSERT dbo.foo SELECT 3, 'Foo=bar,x=23';
INSERT dbo.foo SELECT 4, 'SomeID=767';
INSERT dbo.foo SELECT 5, 'x=y,SomeID=126,OtherID=3383';

SELECT ID, Value = SUBSTRING(TypeValue, 
  CHARINDEX('SomeID', TypeValue) + 7, 
  COALESCE(NULLIF(CHARINDEX(',', SUBSTRING(TypeValue, 
    CHARINDEX('SomeID', TypeValue) + 8, 1000)), 0), 1000))
FROM dbo.foo
WHERE ',' + TypeValue LIKE '%,SomeID=%';

结果:

ID  Value
--- -----
1   1232
2   1254
4   767
5   126

如果你知道你想要哪一行:

DECLARE @ID INT, @Param VARCHAR(32);
SET @ID = 5;
SET @Param = 'SomeID';


DECLARE @val INT;

SELECT @val = SUBSTRING(TypeValue, 
  CHARINDEX(@Param, TypeValue) + LEN(@Param) + 1, 
  COALESCE(NULLIF(CHARINDEX(',', SUBSTRING(TypeValue, 
    CHARINDEX(@Param, TypeValue) + LEN(@Param) + 2, 1000)), 0), 1000))
FROM dbo.foo
WHERE ID = @ID 
AND ',' + TypeValue LIKE '%,' + @Param + '=%';

PRINT @val;

结果:

126

当然,这并不能防止有人将字符串放入 SomeID 值,因此如果证明是数字,则仅转换为 INT 可能更安全。但你明白了。

于 2012-06-22T14:24:12.637 回答
1

使用拆分:http: //blogs.microsoft.co.il/blogs/itai/archive/2009/02/01/t-sql-split-function.aspx

DECLARE @Str NVARCHAR(4000)
SELECT @Str = 'SomeID=1232,OtherID=3383'
SELECT * into #temp FROM   [dbo].[Split] (@Str, ',') 

select property = (select Data from dbo.Split((select Data from #temp where Id = b.id), '=') where Id = 1),
       value = (select Data from dbo.Split((select Data from #temp where Id = b.id), '=') where Id = 2)
from #temp b
于 2012-06-22T15:17:22.277 回答
0
SELECT [key] = LEFT(s.value, ca.pos - 1),
   [value] = SUBSTRING(s.value, ca.pos + 1, 8000)
FROM STRING_SPLIT(@activityValue, '|') s
CROSS APPLY (VALUES(CHARINDEX(':', s.value))) ca(pos);

从这里拉出来:Is it possible to parse key:value pairs in SQL

于 2022-02-24T20:34:14.613 回答