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 に答える