拆分作为变量/值对的列,并在sql中分配var

时间:2012-06-22 14:09:59

标签: sql tsql sql-server-2000

我有一个类似的查询:

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)

2 个答案:

答案 0 :(得分: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可能更安全。但你明白了。

答案 1 :(得分:1)

使用split: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