0

動的 SQL クエリを作成しようとしています。

パイプで区切られた Guid の文字列であるフィールドがあります。

このフィールドに Guid を持つすべてのユーザーを検索するクエリを実行したいと考えています。

以下の例では、例としていくつかのダミー GUID を追加しました。2 番目のクエリは、希望どおりに機能します。REPLACE 関数を使用した最初のクエリが機能しません。Replace Select だけを実行すると、2 番目のクエリにあるものが返されるので、同じ結果が返されると予想されます。誰かが私がここで欠けているものを手伝ってくれますか? ありがとう。

select * from CMS_User 
WHERE Convert(varchar(36),UserGUID) IN(
    select '''' + REPLACE('6415B8CE-8072-4BCD-8E48-9D7178B826B7|AEDD6E3F-61C1-46CF-B2D4-750180036FFF','|',''',''') + ''''
    )


select * 
from CMS_User 
WHERE Convert(varchar(36),UserGUID) IN('6415B8CE-8072-4BCD-8E48-9D7178B826B7','AEDD6E3F-61C1-46CF-B2D4-750180036FFF')

更新: ここでは、私が何をしているのかをさらに示すために、いくつかの SqlFiddle クエリを示します。

すべてを選択すると、2 つのレコードが表示されます http://sqlfiddle.com/#!3/a5e426/5

ハードコーディングされたサブクエリで選択 http://sqlfiddle.com/#!3/a5e426/6

IN サブクエリに置き換えようとしているパイプ区切りの Guid で選択します http://sqlfiddle.com/#!3/a5e426/7

サブクエリを選択して、必要なものを取得していることを示します http://sqlfiddle.com/#!3/a5e426/8

4

1 に答える 1

0

私たちの残りの部分は、クエリが返そうとしているものについて、もう少し情報が必要だと思います. (値のハードコーディングが受け入れられない理由)。私の推測では、複数のユーザーを考慮できる動的クエリが必要です。以下のクエリでは、セットを任意の数の GUID に置き換えることができるはずです。

私は exec コマンドの使用が嫌いですが、それがここで機能するようです

declare @tempID varchar(max)
set @tempID = '6415B8CE-8072-4BCD-8E48-9D7178B826B7|AEDD6E3F-61C1-46CF-B2D4-750180036FFF'
set @tempID =  char(39) + replace (@tempID
                    ,'|', CHar(39) + char(44) + Char(39)) + char(39)

exec(' select * from CMS_User WHERE UserGUID IN(' + @tempID + ')  ')

編集: 別のテーブルから GUID を取得することについて言及しました。そのテーブルを直接参照しないのはなぜですか?

Select * from CMS_User 
WHERE UserGUID in(select UserGUID from othertable)
于 2013-08-19T20:44:22.347 に答える