2016-01-21 1 views
2

Voici ma procédure stockée ci-dessous. Je concatène @CultureCode paramter avec le nom de vue qui est [_0002HR_EmployeeNames_ en-US _View]. La partie en-US sera passée à travers un paramètre nommé @CultureCode. Est-il possible de le faire parce que j'ai l'obligation de ne pas utiliser la requête dynamique. Je vous remercie.Comment passer le nom de vue dynamique dans une procédure stockée SQL sans utiliser de requête dynamique?

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) 
+1

Tag dbms produit utilisé. (Ne ressemble pas du tout à ANSI SQL ...) – jarlh

Répondre

1

Ce n'est pas possible dans T-SQL jusqu'à présent. Des choses comme les clauses TOP, les noms de table ou de colonne ne peuvent pas être paramétrés. Un moyen serait de créer un union sur toutes les tables/vues possibles, d'ajouter une nouvelle colonne qui correspond au nom de la table/vue et de le filtrer.

Comme ceci:

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 

Une autre (et peut-être le plus « propre » façon) serait seulement avoir une seule table et faire de la culture une colonne dans ce tableau, donc il vous suffit de passer le Chaîne de culture correcte à filtrer sur cette colonne.

+0

J'ai entendu dire qu'il y avait un moyen de le faire mais je ne sais vraiment pas ce que c'est. Merci pour votre avis. S'il vous plaît noter ma question comme je suis nouveau à stackoverflow. Merci une fois de plus. –

+1

Vous pouvez également créer une vue unique en tant qu'union de toutes vos vues dépendant de la culture qui introduit une nouvelle colonne comme je l'ai suggéré dans ma réponse. –

1

Vous avez donc une vue par langue. Ils obtiennent les données des tables pour leur langue particulière. Mais maintenant vous voulez écrire une procédure qui n'est pas spécifique à la langue. La solution semble simple: N'utilisez pas les vues de langue, mais accédez directement aux tables. (Ou créez une vue de toutes les langues que vous interrogez avec where language = @language.)