假设你被糟糕的设计困住了,这不需要动态 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 可能更安全。但你明白了。