/ / Msg 1087, Level 16, State 1, Line 25 Трябва да декларирате табличната променлива - sql, sql-server-2008, stored procedures

Msg 1087, Level 16, State 1, Line 25 Трябва да декларирате табличната променлива - sql, sql-server-2008, stored-procedures

Създавам съхранена процедура и в нея съмсъздаване на нова таблица, която прибавя две променливи, идентификатор и getdate () към името на таблицата, когато е създадена. т.е. tablename_ @ id_getdate (). Така че името на таблицата ще се промени в зависимост от това кой id и коя дата се изпълнява. Аз правя това с Dynamic SQL. Тогава след създаването на таблицата трябва да вмъкна записи от нея от временната таблица, създадена по-рано в процедурата (не е показана). Тъй като няма да знам името на таблицата, докато не бъде създадена, се опитвам да я включа в променливата @tablename.

Опитах по-долу скрипта и получавам тази грешка: Msg 1087, Ниво 16, Състояние 1, Линия 25 Трябва да декларира табличната променлива "@TABLENAME".

Тази процедура ще се изпълнява всеки ден или по-малко, а засегнатите записи от изпълнението ще се съхраняват в таблицата tablename_ @ id_getdate (), създадена по време на изпълнението на съхранената процедура.

Има ли друг начин да направите това или е моят синтаксис грешен? Благодаря за вашата помощ.

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

Отговори:

0 за отговор № 1

Както каза Гуфа, за да направите това, което работите, ще трябва да промените последната заявка за вмъкване в динамична заявка като първата си.

Или моето предложение е да го пренапишем с помощта на избиране в заявка като следното, но в зависимост от вашите нужди / ограничения, които може да не са добра идея.

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 "

Това рискува да не получите типовете стойности на правилната колона, които искате, но това може да стане чрез използване на CAST или CONVERT в колоните в избраната част на израза.