Как передать динамическое представление имени в хранимой процедуре SQL без использования динамического запроса?

Вот моя хранимая процедура ниже. Я конкатенирую @CultureCode параметр вместе с именем представления, которое является [_0002HR_EmployeeNames_ru-US_View]. Часть en-US будет передана через параметр с именем @CultureCode, Есть ли способ сделать это, потому что у меня есть требование не использовать динамический запрос. Спасибо.

CREATE PROCEDURE [dbo].[_001HR_Report_Loans] (@Parameters VARCHAR(max))
 AS
 DECLARE @ReportOption VARCHAR(5)    SET @ReportOption     = [dbo].DB_Split(@Parameters, 1) 
 DECLARE @CultureCode VARCHAR(10)    SET @CultureCode      = [dbo].DB_Split(@Parameters, 2) 
 DECLARE @ShowItems VARCHAR(5)       SET @ShowItems        = [dbo].DB_Split(@Parameters, 3) 
 DECLARE @StartDate NVARCHAR(8)      SET @StartDate        = [dbo].DB_Split(@Parameters, 4) 
 DECLARE @EndDate NVARCHAR(8)        SET @EndDate          = [dbo].DB_Split(@Parameters, 5) 
 DECLARE @EmployeeCode NVARCHAR(30)  SET @EmployeeCode     = [dbo].DB_Split(@Parameters, 6) 
 DECLARE @BranchCode NVARCHAR(30)    SET @BranchCode       = [dbo].DB_Split(@Parameters, 7) 

 --IF @StartDate = ''
    -- SET @StartDate = NULL


 SELECT HR.*, EN.[Name] AS EmployeeName
 FROM [0002HR_EmployeeLoans] HR  
 LEFT JOIN [_0002HR_EmployeeNames_ + '@CultureCode' +_View]  EN ON HR.EmployeeCode = EN.EmployeeCode 
 LEFT JOIN [_0002HR_EmployeePackagesView]  EP ON EP.EmployeeCode = HR.EmployeeCode

 WHERE 
(HR.EmployeeCode = @EmployeeCode OR @EmployeeCode IS NULL)
AND
(EP.BranchCode = @BranchCode OR @BranchCode IS NULL)
AND
(HR.Date BETWEEN @StartDate AND @EndDate OR @StartDate IS NULL AND @EndDate IS NULL) 
AND
(HR.Date >= @StartDate OR @StartDate IS NULL)
AND
(HR.Date  <= @EndDate OR @EndDate IS NULL)

2 ответа

Таким образом, у вас есть представление по языку. Они получают данные из таблиц для своего конкретного языка. Но теперь вы хотите написать процедуру, которая не зависит от языка.

Решение кажется простым: не используйте языковые представления, а вместо этого обращайтесь к таблицам напрямую. (Или создайте представление на всех языках, к которому вы обращаетесь where language = @language.)

Пока это невозможно в T-SQL. Вещи как TOP предложения, имена таблиц или столбцов не могут быть параметризованы.

Одним из способов было бы создать union над всеми возможными таблицами / представлениями добавьте новый столбец, соответствующий имени таблицы / представления, и отфильтруйте его.

Как это:

SELECT * FROM
(
    SELECT 'Table1' as TableName, t1.* FROM Table1 t1 WHERE ...
    UNION ALL
    SELECT 'Table2' as TableName, t2.* FROM Table2 t2 WHERE ...
) tmp
WHERE TableName = @tableName

Другим (и, возможно, самым "чистым") способом было бы иметь только одну единственную таблицу и сделать культуру столбцом в этой таблице, поэтому вам нужно только передать правильную строку культуры для фильтрации по этому столбцу.

Другие вопросы по тегам