悪い設計で立ち往生していると仮定すると、これには動的 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 に変換する方が安全かもしれません。しかし、あなたは要点を理解します。