代码之家  ›  专栏  ›  技术社区  ›  Yordan Georgiev

在SQL Server 2005/2008中的架构中使用变量扩展

  •  0
  • Yordan Georgiev  · 技术社区  · 16 年前

    我正在尝试创建存储过程,该存储过程将根据传递的参数决定使用哪种语言?
    我怎么能做这种事?

    declare @en varchar(50) = 'en'
    declare @fi varchar(50) = 'fi'
    
    select * from [@en].[TestingLanguagesInNameSpacesDelMe]
    select * from [@fi].[TestingLanguagesInNameSpacesDelMe]
    
    4 回复  |  直到 16 年前
        1
  •  2
  •   Cade Roux    16 年前

    我还提倡单表/语言分段设计,其中所有语言都存储在一个带有语言列的单表中。

    动态SQL可能容易受到SQL注入的攻击。如果不能信任@lang变量(或者需要验证架构和表是否为有效组合),则可以使用如下技术对照sys.schemas检查该变量:

    DECLARE @template AS varchar(max)
    SET @template = 'SELECT * FROM {object_name}'
    
    DECLARE @object_name AS sysname
    
    SELECT @object_name = QUOTENAME(s.name) + '.' + QUOTENAME(o.name)
    FROM sys.objects o
    INNER JOIN sys.schemas s
        ON s.schema_id = o.schema_id
    WHERE o.object_id = OBJECT_ID(QUOTENAME(@LANG) + '.[TestingLanguagesInNameSpacesDelMe]')
    
    IF @object_name IS NOT NULL
    BEGIN
        DECLARE @sql AS varchar(max)
        SET @sql = REPLACE(@template, '{object_name}', @object_name)
        EXEC (@sql)
    END
    

    现在您拥有了动态SQL的功能和灵活性,但它不易被注入。

        2
  •  2
  •   John Gietzen    16 年前

    您可以使用动态SQL:

    DECLARE @SQL varchar(MAX)
    SELECT @SQL = 'select * from ['
                  + @LANG
                  + '].[TestingLanguagesInNameSpacesDelMe]'
    sp_executesql @SQL
    

    但我会考虑使用带有索引列的单个表,并使用以下语言:

    select * from [dbo].[TestingLanguagesInNameSpacesDelMe] where [lang] = @LANG
    
        3
  •  0
  •   cbeuker    16 年前

    这个怎么样?

    声明@sqlcall varchar(200)

    set@sqlcall='select*from['+@language+'].[testingLanguagesInNamespacesDelme]'

    Exc@ SQL调用

    我必须同意另一个已发布的答案,创建一个指示语言的列,并对语言进行筛选。

        4
  •  0
  •   bdukes Jon Skeet    16 年前
    -- Yep I also concluded that it is the dynamic sql ..
    declare @tableName varchar(50) 
    set @tableName ='TestingLanguagesInNameSpacesDelMe'
    
    
    
    declare @sql nvarchar(200)= 'select * from ' 
    declare @fi varchar(40) = 'fi'
    declare @en varchar(50) = 'en'
    
    set @sql = @sql + '[' + @fi + '].[' + @tableName + ']'
    print @sql
    exec sp_executesql @sql
    
    推荐文章