2

コード

create table ExampleTable
(
    Name varchar(500)
    CultureCode(5)
)

insert into ExampleTable values('Dit is een test', 'nl-NL')
insert into ExampleTable values('This is a test', 'en-GB')
insert into ExampleTable values('Ceci est un test', 'fr-FR')
insert into ExampleTable values('Dies ist ein Test', 'de-DE')

create procedure GetNameByCultures
(
@CultureCodes varchar(250)
)
as 
begin
//Get ExampleTable items according to the culture codes stated in @CultureCodes
end

-例:

CREATE TYPE StringListType AS TABLE
(
    [str] varchar(5) NULL
)

MS SQL 2012 V11.0.2100.60 を使用しています

状況

ラベルを抽出するための最良の方法(パフォーマンスに関して)を見つけようとしています。私が考えたが、まだテストしていない方法は次のとおりです。

  • 上記のように、ユーザー定義のテーブル タイプを作成します。

利点: データベースでのパフォーマンスがほとんどないことはわかっています。

欠点: ストアド プロシージャに別のパラメーターを追加する必要があります。

  • 文字列を文字で分割する関数の作成: ','

欠点: SQL では、"Right"、"Left"、"Like" およびその他の varchar 変換/編集プロパティを使用するのが遅いことを知っています。

利点: 処理をデータベースに保持できます。

現在の状況では、ユーザー定義のテーブル型内で 1 つのカルチャコードのみを送信しています。したがって、UDTT を UDTT に追加できないため、この UDTT にカルチャコードを追加することはできません。私の唯一のオプションは、ストアド プロシージャに別のパラメーターを追加することです。これはあまり問題にはなりませんが、1 つだけにしておくことをお勧めします。

誰かがたまたま別の(より良い?)方法を知っていますか、またはこれらのいずれかを使用する必要がありますか?

4

3 に答える 3

0

左/右の代わりにxmlの置換とキャストを使用して文字列を分割するのはどうですか?

    declare @ExampleTable table
    (
        Name varchar(500),
        CultureCode varchar(5)
    )

    insert into @ExampleTable values('Dit is een test', 'nl-NL')
    insert into @ExampleTable values('This is a test', 'en-GB')
    insert into @ExampleTable values('Ceci est un test', 'fr-FR')
    insert into @ExampleTable values('Dies ist ein Test', 'de-DE')


    declare @CultureCodes varchar(250)
    set @CultureCodes = 'nl-NL,en-GB,fr-FR'

    declare @xml xml
    set @xml = cast('<culturecodes><culture>'+REPLACE(@CultureCodes,',','</culture><culture>')+'</culture></culturecodes>' as xml)

    select 
           C.element.value('.','varchar(max)') as CultureCode_splited
          ,E.CultureCode 
          ,E.name
    from @xml.nodes('/culturecodes/culture')C(element)
    inner join @ExampleTable E
    on E.CultureCode = C.element.value('.','varchar(max)')

結果セットはこのようです...

    CultureCode_splited     CultureCode name
    nl-NL                   nl-NL       Dit is een test
    en-GB                   en-GB       This is a test
    fr-FR                   fr-FR       Ceci est un test
于 2013-01-31T17:02:28.447 に答える
0

2008年以降を使用しているため、テーブル値パラメーターが最適な方法です。( MSDN を参照してください)。

SQL Server MVP の Erland Sommarskog による、分析とパフォーマンスの詳細を含む、利用可能なさまざまな方法に関する非常に包括的な記事を読むことを強くお勧めします。

于 2013-02-02T23:14:07.057 に答える
0

カルチャのリストをカンマ区切りの文字列として渡し、テーブルを返す関数を定義してから、このテーブルをサンプル テーブルに結合します。文字列に含まれる要素の数が少ない限り、パフォーマンスが低下することはありません。

最大 N カルチャ コードを渡すという制限に耐えることができる場合は、次のようなものを試すことができます

create procedure GetNameByCulture 
  @CultureInfo varchar(5),
  @CultureInfo1 varchar(5) = null,
  @CultureInfo2 varchar(5) = null
as
 select e.* 
   from ExampleTable e 
        join (
          select @CultureInfo as CultureInfo union
          select @CultureInfo1 union
          select @CultureInfo2
          ) x 
          on e.CultureInfo = x.CultureInfo

これは文字列バージョンよりも少し速いと思います。しかし、前述したように、とにかく大したことではありません。

于 2013-01-31T09:31:28.113 に答える