2010-11-25 2 views
1

Quelqu'un me dit quel est le problème avec la création de cette procédure stockée.Erreur lors de la création de la procédure stockée

CREATE PROC ImportData 
AS 
BEGIN 

    DECLARE @DatabasePath VARCHAR(MAX) 
    SET @DatabasePath = 'E:\ABC.xls' 

    DECLARE @sql  nvarchar(MAX) 
    SET @sql = ' 
    INSERT INTO [dbo].[Table_1] 
    SELECT * 
    FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'', 
      ''Excel 8.0;Database=' + @DatabasePath + ', 
      ''SELECT * FROM [Sheet1$]'') AS xlsTable' 

    EXEC sp_executesql @sql 
    GO 

END 

ERROR:- 
Incorrect syntax near '@sql'. 
Msg 102, Level 15, State 1, Line 2 
Incorrect syntax near 'END'. 
+1

Un moteur de base de données particulier, ou serez-vous satisfait des suppositions aléatoires? –

+0

Le moteur de base de données Je suppose que votre utilisation nécessite que toutes les chaînes littérales soient écrites en Klingon. Aussi, débarrassez-vous du "go". et SQL dynamique suce. –

Répondre

2

Retirez le GO de l'intérieur de la procédure stockée

Quelque chose comme

CREATE PROC ImportData 
AS 
BEGIN 

    DECLARE @DatabasePath VARCHAR(MAX) 
    SET @DatabasePath = 'E:\ABC.xls' 

    DECLARE @sql  nvarchar(MAX) 
    SET @sql = ' 
    INSERT INTO [dbo].[Table_1] 
    SELECT * 
    FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'', 
      ''Excel 8.0;Database=' + @DatabasePath + ', 
      ''SELECT * FROM [Sheet1$]'') AS xlsTable' 

    EXEC sp_executesql @sql 

END 
+0

Pouvez-vous expliquer la raison derrière cela. – Sukhjeevan

+0

Dans SSMS Go est un terminateur de déclaration/terminateur de lot. Ainsi, lorsque vous essayez d'exécuter l'instruction create, le serveur sql tente d'analyser le script et échoue. –

1

Vous ne pouvez pas avoir une terminaison de lot (GO) dans le corps d'une procédure stockée.

Questions connexes