Я не понимаю, почему я продолжаю получать эту ошибку. Любой может помочь мне понять, почему эта ошибка подходит, будет очень признательна. Я пытаюсь обновить большую базу данных и попытаться заменить строку местоположения по умолчанию для всех вложений с помощью «D:». Я чувствую, что я рядом, но я не понимаю эту ошибку. Этот запрос успешно проходит через все мои имена таблиц, сохраненные в @Tables, но на каждом из них я получаю ошибку. Вот мой код ... Ошибка: Необходимо объявить скалярную переменную «@oldPath»Должен объявить скалярную переменную
DECLARE @newPath VARCHAR(500);
SET @newPath = 'D:\temp';
DECLARE @oldPath VARCHAR(500);
SET @oldPath = (SELECT Value FROM Settings WHERE Name = 'AttachmentDirectoryPath');
DECLARE @Tables TABLE
(
myTableName VARCHAR(500)
)
insert into @Tables(myTableName) values ('WorkOrderMasterAttachments');
insert into @Tables(myTableName) values ('BillOfMaterialAttachments');
insert into @Tables(myTableName) values ('CustomerAttachments');
insert into @Tables(myTableName) values ('ToolAttachments');
insert into @Tables(myTableName) values ('FacilityAttachments');
insert into @Tables(myTableName) values ('LocationAttachments');
insert into @Tables(myTableName) values ('AssetAttachments');
insert into @Tables(myTableName) values ('ContractorAttachments');
insert into @Tables(myTableName) values ('VendorAttachments');
insert into @Tables(myTableName) values ('WorkOrderAttachments');
insert into @Tables(myTableName) values ('ClosedWorkOrderAttachments');
insert into @Tables(myTableName) values ('EmployeeAttachments');
insert into @Tables(myTableName) values ('PurchaseOrderAttachments');
insert into @Tables(myTableName) values ('PurchaseOrderHistoryAttachments');
insert into @Tables(myTableName) values ('PartAttachments');
insert into @Tables(myTableName) values ('AssetSystemAttachments');
DECLARE cursor_tables cursor
FOR SELECT myTableName from @Tables
OPEN cursor_tables
DECLARE @loopTableName VARCHAR(100)
fetch next from cursor_tables
into @loopTableName
DECLARE @updateSql VARCHAR(2000);
WHILE @@FETCH_STATUS = 0
BEGIN
SET @updateSql = ' UPDATE ' + @loopTableName +
' SET Path = REPLACE(Path,@oldPath,@newPath)'
--print @updateSql
EXEC(@updatesql)
fetch next from cursor_tables
into @loopTableName
END
CLOSE cursor_tables
DEALLOCATE cursor_tables
Разве это не было бы проще просто написать свои заявления об обновлении 15-16 вместо того, чтобы делать это в цикле? Было бы намного меньше печатать, и это было бы намного проще. –
Да, но я буду загружать @ Таблицы со всеми таблицами с именами LIKE '% Attachments%' вместо всех операторов insert. – techkris
Даже если вы используете динамический sql, я бы не использовал для этого цикл. Используйте динамический sql для сборки операторов sql и выполните его все сразу. –