如何在不使用动态查询的情况下在SQL存储过程中传递动态视图名称?

时间:2016-01-21 13:31:35

标签: sql sql-server dynamic-sql dynamic-queries

以下是我的存储过程。我正在连接@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)

2 个答案:

答案 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查询的全语言视图。)