2017-09-19 2 views
1

J'ai cette procédure stockée qui fonctionne bien;Procédure stockée T-SQL, utilisez une variable comme référence de table dans la requête

ALTER PROCEDURE [dbo].[currentCoForHiLo] 
    @CoKeyCode Char(50) 
BEGIN 
    SET NOCOUNT ON; 

    CREATE TABLE ##WrkedOnCo(cKeyCode Char(50), DateInt Int, HighValu Int, LowValu Int) 

    CREATE CLUSTERED INDEX IDX_CI ON ##WrkedOnCo(DateInt) 

    INSERT INTO ##WrkedOnCo 
     SELECT KeyCode, DateAsInt, HighValu, LowValu 
     FROM EODValuesAU 
     WHERE KeyCode = @CoKeyCode; 
END 

La procédure a été d'obtenir des données d'une table EODValuesAU.

J'ai maintenant plusieurs tables EODValuesAU, EODValuesUS, EODValuesUK.

J'ai essayé de modifier le code à la suivante, mais la requête a maintenant des erreurs. Je veux utiliser une variable pour la table dans la requête. Y a-t-il un moyen de le faire? Voir le code modifié ci-dessous;

ALTER PROCEDURE [dbo].[currentCoForHiLo] 
    @CoKeyCode Char(50), @CounrtyCode Char(10) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    CREATE TABLE ##WrkedOnCo(cKeyCode Char(50), DateInt Int, HighValu Int, LowValu Int) 

    CREATE CLUSTERED INDEX IDX_CI ON ##WrkedOnCo(DateInt) 

    INSERT INTO ##WrkedOnCo 
     SELECT KeyCode, DateAsInt, HighValu, LowValu 
     FROM 'EODValues' + @CountryCode 
     WHERE KeyCode = @CoKeyCode; 
END 
+6

Pourquoi avez-vous pas un seul ' Table EODValues ​​avec une colonne country * qui peut contenir des requêtes '' UK', 'US',' AU', et donc une simple requête normale? À l'heure actuelle, vous avez fait l'erreur d'incorporer des données "pouvant être interrogées" dans les * métadonnées * en les plaçant dans le nom de la table. –

+1

vous ne pouvez pas utiliser d'expressions ou de variables comme nom de table. Il est préférable de créer un SQL dynamique si vous souhaitez utiliser des noms dynamiques. – Yeou

+2

Pourquoi créez-vous et insérez-vous dans une table temporaire globale? Cela signifie que les appels simultanés à la procédure stockée peuvent échouer et que vous n'avez besoin d'aucune sorte de table temporaire dans le code affiché. –

Répondre

0

Dynamic SQL est votre ami ici.

Au lieu de l'INSERT, essayez quelque chose comme ceci:

DECLARE @sql VARCHAR(400); 
SET @sql = 'INSERT INTO ##WrkedOnCo SELECT KeyCode, DateAsInt, HighValu, LowValu FROM EODValues'[email protected]+' WHERE KeyCode = @CoKeyCode;'; 
PRINT @sql; --check its what you want first 
--EXEC (@sql); 

commentaire de Damien_The_Unbeliever serait le meilleur, SQL dynamique peut se salir assez rapidement

0
-- you Have to Use Dynamic Query to desire Output 


ALTER PROCEDURE [dbo].[currentCoForHiLo] 
    @CoKeyCode NVARCHAR(50),@CounrtyCode NVARCHAR (10) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    CREATE TABLE ##WrkedOnCo(cKeyCode NVARCHAR(50), DateInt Int, HighValu Int, LowValu Int) 

    CREATE CLUSTERED INDEX IDX_CI ON ##WrkedOnCo(DateInt) 

    DECLARE @sql VARCHAR(4000) 
    SET @sql = 'INSERT INTO ##WrkedOnCo 
       SELECT KeyCode, DateAsInt, HighValu, LowValu FROM EODValues'[email protected]+' WHERE KeyCode = '''[email protected]+''''; 
    PRINT @sql; 
    EXEC (@sql); 
END