Страница 1 из 1
MS SQL Server 2000 вопросик
Добавлено: 12 янв 2006, 10:45
AlexK
Есть таблица с именами других таблиц.
Нужно сделать
foreach TableName
delete from TableName where someid=x
Такое возможно сделать в самом SQLе?
thx
Добавлено: 12 янв 2006, 11:32
ura
Это можно оформить как хранимую процедуру,
сначала сделать запрос по нужной таблице, пройтись по ней или составить комплексный запрос и выполнить его. Одной командой боюсь не обойтись, но надо смотреть на исходную таблицу.
Добавлено: 12 янв 2006, 11:38
AlexK
Таблица елементарная, типа такого:
Код: Выделить всё
CREATE TABLE [dbo].[TableNames] (
ID int IDENTITY (1, 1) NOT NULL ,
tableName nvarchar (50)
) ON [PRIMARY]
GO
Пример можно? Что имеется виду под "комплексным запросом"?
Добавлено: 12 янв 2006, 11:53
ura
А что, все таблицы имеюь одинаковую структуру, например имеют такое поле someid?
Если да, то решение в лоб это хранимая процедура которая создает курсор с именами таблиц, бежит по ним и вызывает запрос на удаление для каждой таблицы.
Пример я сейчас не наваяю, но в примерах самого SQL это должно быть.
Re: MS SQL Server 2000 вопросик
Добавлено: 12 янв 2006, 12:07
Vovchik
AlexK писал(а):Есть таблица с именами других таблиц.
Нужно сделать
foreach TableName
delete from TableName where someid=x
Такое возможно сделать в самом SQLе?
thx
Select 'delete from ' + table_name + ' where someid = x' from source_table
Результат сохранить в файл. ПОлучишь сикуел файл в котором будет много таких команд чилом равным количеству таблиц.
Добавлено: 12 янв 2006, 12:08
Vovchik
ura писал(а):Это можно оформить как хранимую процедуру,
сначала сделать запрос по нужной таблице, пройтись по ней или составить комплексный запрос и выполнить его. Одной командой боюсь не обойтись, но надо смотреть на исходную таблицу.
Токма ему придется использовать динамический сикуел.
Добавлено: 12 янв 2006, 12:48
ura
Токма ему придется использовать динамический сикуел.
Так если только средствами SQL, значит как понимается или одним запросом или процедурой.
Добавлено: 12 янв 2006, 12:57
Vovchik
ura писал(а):Токма ему придется использовать динамический сикуел.
Так если только средствами SQL, значит как понимается или одним запросом или процедурой.
В запросе ты хрен сделаешь. А в процедуре мона сделать динамический сикуел. Токма придется попыхтеть малость.
Добавлено: 12 янв 2006, 13:04
AlexK
Разобрался,всем спасибо.
Код: Выделить всё
DECLARE @AuditID nvarchar(50)
SET @AuditID = 'BALD1AMA'
DECLARE @TableName nvarchar(50)
DECLARE Tables_Cursor CURSOR FOR
SELECT tableName FROM dbo.tblTables
OPEN Tables_Cursor
FETCH NEXT FROM Tables_Cursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Deleting from ' + @TableName
EXECUTE('delete from '+@TableName+' where AuditID='''+@AuditID+'''')
FETCH NEXT FROM Tables_Cursor INTO @TableName
END
CLOSE Tables_Cursor
DEALLOCATE Tables_Cursor
Добавлено: 29 янв 2006, 20:05
Lepsik
exec sp_MSforeachtable
sql
Добавлено: 30 янв 2006, 21:09
Yuri Dimant
Lepcik-Celko, ты бы хоть пояснял давая такие советы что эта процедура is undocumented and usupported
Добавлено: 30 янв 2006, 23:17
AlexK
да дело даже не в этом, там определенный набор таблиц надо было обнулить, а не foreachtable. но за желание помочь спасибо

Re: sql
Добавлено: 07 фев 2006, 21:11
Lepsik
Yuri Dimant писал(а):Lepcik-Celko, ты бы хоть пояснял давая такие советы что эта процедура is undocumented and usupported
ну и что ? mssql200/2005 отлично поддерживают.
пользоваться легко
Код: Выделить всё
exec sp_MSForeachTable 'if exists (select * from tbl where id=substring(''?'', 8, len(''?'')-8) ) truncate table ?'