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 转换/编辑属性很慢

UpSide:我可以将处理过程保存在数据库中。

在当前情况下,我只在用户定义的表类型中发送一个文化代码。因此,无法在此 UDTT 中添加文化代码,因为您无法将 UDTT 添加到 UDTT。我唯一的选择是向存储过程添加另一个参数,这应该不是什么大问题……但我们希望只保留一个参数。

有没有人碰巧知道另一种(更好的?)方法,还是我应该使用其中一种?

4

3 回答 3

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 回答
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 回答