Създавам съхранена процедура и в нея съмсъздаване на нова таблица, която прибавя две променливи, идентификатор и 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 в колоните в избраната част на израза.