2

これが私のストアドプロシージャです。@CultureCode[_0002HR_EmployeeNames_ en-US _View]であるビュー名と一緒にパラメーターを連結しています。en-US の部分は、 as という名前のパラメーターを介して渡され@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)
4

2 に答える 2

1

これは、これまでのところ T-SQL では不可能です。句TOP、テーブル、列名などはパラメータ化できません。

1 つの方法は、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

もう 1 つの (そしておそらく最も「クリーンな」) 方法は、1 つのテーブルのみを持ち、カルチャをそのテーブルの列にすることです。そのため、正しいカルチャ文字列を渡してその列をフィルター処理するだけで済みます。

于 2016-01-21T13:33:35.970 に答える