以下是我的存储过程。我正在连接@CultureCode
参数和视图名称,即[_0002HR_EmployeeNames_ en-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)
答案 0 :(得分:1)
到目前为止,这在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
另一个(也可能是#34; clean&#34;方式)只有一个表,并将该文化作为该表中的一列,所以你只需要传递正确的文化字符串来过滤那一栏。
答案 1 :(得分:1)
所以你有每种语言的观点。他们从表中获取特定语言的数据。但是现在你想编写一个非语言特定的程序。
解决方案似乎很简单:不要使用语言视图,而是直接访问表。 (或构建使用where language = @language
查询的全语言视图。)