Страница 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 ?'