Использование расширений переменных в схеме в SQL Server 2005/2008 - PullRequest
0 голосов
/ 07 апреля 2009

Я пытаюсь создать хранимую процедуру, которая решит, какой язык использовать на основе переданного параметра?
Как я могу сделать что-то подобное?

declare @en varchar(50) = 'en'
declare @fi varchar(50) = 'fi'

select * from [@en].[TestingLanguagesInNameSpacesDelMe]
select * from [@fi].[TestingLanguagesInNameSpacesDelMe]

Ответы [ 4 ]

2 голосов
/ 08 апреля 2009

Я бы также рекомендовал проект с одной таблицей / сегментированным языком, в котором все языки хранятся в одной таблице со столбцом языка.

Динамический 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 голосов
/ 07 апреля 2009

Вы можете использовать динамический SQL:

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

Но я бы рассмотрел использование ОДНОЙ таблицы с индексированной КОЛОНКОЙ с языком:

select * from [dbo].[TestingLanguagesInNameSpacesDelMe] where [lang] = @LANG
0 голосов
/ 07 апреля 2009
-- 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
0 голосов
/ 07 апреля 2009

Как насчет этого?

объявляет @sqlCall varchar (200)

set @sqlCall = 'select * from [' + @language + ']. [TestingLanguagesInNameSpacesDelMe]'

exec @ sqlCall

Я должен был бы согласиться с другим опубликованным ответом, сделать столбец с указанием языка и просто отфильтровать по языку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...