Как передать динамическое представление имени в хранимой процедуре 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
Другим (и, возможно, самым "чистым") способом было бы иметь только одну единственную таблицу и сделать культуру столбцом в этой таблице, поэтому вам нужно только передать правильную строку культуры для фильтрации по этому столбцу.