我有一个类似的查询:
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)
答案 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