/ / Msg 1087, niveau 16, état 1, ligne 25 Doit déclarer la variable de table - sql, sql-server-2008, procédures stockées

Msg 1087, niveau 16, état 1, ligne 25 Doit déclarer la variable de table - sql, sql-server-2008, procedures stockées

Je crée une procédure stockée dans laquelle je suiscréer une nouvelle table qui ajoute deux variables, un ID et getdate () au nom de la table lors de sa création. i.e tablename_ @ id_getdate (). Le nom de la table changera donc en fonction de son identifiant et de sa date d'exécution. Je le fais avec le SQL dynamique. Ensuite, une fois la table créée, je dois y insérer des enregistrements à partir d'une table temporaire créée précédemment dans la procédure (non affichée). Étant donné que je ne saurai pas connaître le nom de la table tant qu’elle n’a pas été créée, j’essaie de l’insérer en utilisant la variable @tablename.

J'ai essayé le script ci-dessous et j'obtiens cette erreur: Msg 1087, Niveau 16, Etat 1, Ligne 25 Doit déclarer la variable de table "@TABLENAME".

Cette procédure s'exécutera environ tous les deux jours et les enregistrements concernés de l'analyse seront stockés dans la table tablename_ @ id_getdate () créée lors de l'exécution de la procédure stockée.

Y a-t-il une autre façon de faire ou ma syntaxe est-elle erronée? Merci de votre aide.

IF EXISTS (SELECT 1 FROM #DUPS2)
BEGIN

DECLARE @TableName NVARCHAR(128)
DECLARE @SQLString NVARCHAR(MAX)
,@DATE VARCHAR (10)
,@BN SMALLINT

SET @BN = 108
SET @DATE = CONVERT(VARCHAR(10),GETDATE(),112)

SET @TABLENAME = "schema.dbo.tableName_" + CAST (@BN AS VARCHAR) +"_"+ @DATE

SET @SQLString = "CREATE TABLE "+" "+@TABLENAME+ " "
+ "( " + "BUSINESS_NAME" + " " +"VARCHAR(120)" +" "+"NULL," +
"CLAIM_ID" + " " +"NVARCHAR(120)" +" "+"NULL," +
"CONTACT_ID" + " " +"INT" +" "+"NULL," +
"COUNT_OF_DUPES" + " " +"NVARCHAR(5)" +" "+"NULL" +") ON     [PRIMARY] "


EXEC @SQLString

---TABLE IS CREATED AND NOW WE INSERT RECORDS TO IT

INSERT INTO @TABLENAME  --the table name just created.
SELECT D.*
FROM #DUPS2 D     --contains duplicate contact records found
JOIN TABLE1  T1 WITH (NOLOCK)
ON D.CONTACT_ID = T1.CONTACT_ID
WHERE T1. active_ind = 1

END

Réponses:

0 pour la réponse № 1

Comme Guffa l'a dit, pour que votre travail fonctionne, vous devrez changer la dernière requête d'insertion en une requête dynamique comme la première.

Ou ma suggestion serait de le réécrire en utilisant une requête select en requête comme suit, mais cela peut ne pas être une bonne idée selon vos besoins / restrictions.

SET @SQLString = "SELECT D.* " +
" INTO " + @TABLENAME +  --the table name just created.
" FROM #DUPS2 D " +    --contains duplicate contact records found
" JOIN TABLE1  T1 WITH (NOLOCK) " +
" ON D.CONTACT_ID = T1.CONTACT_ID " +
" WHERE T1. active_ind = 1 "

Cela risque de ne pas obtenir les types de valeur de colonne appropriés, mais vous pouvez le faire en utilisant CAST ou CONVERT sur les colonnes de la partie sélectionnée de l'instruction.