MS SQL Server 2000 вопросик

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
AlexK
Пользователь
Сообщения: 118
Зарегистрирован: 21 окт 2005, 03:16
Откуда: было оттуда, теперь отсюда

MS SQL Server 2000 вопросик

Сообщение AlexK »

Есть таблица с именами других таблиц.

Нужно сделать

foreach TableName
delete from TableName where someid=x


Такое возможно сделать в самом SQLе?

thx
ura
Житель
Сообщения: 915
Зарегистрирован: 09 мар 2003, 22:46

Сообщение ura »

Это можно оформить как хранимую процедуру,
сначала сделать запрос по нужной таблице, пройтись по ней или составить комплексный запрос и выполнить его. Одной командой боюсь не обойтись, но надо смотреть на исходную таблицу.
AlexK
Пользователь
Сообщения: 118
Зарегистрирован: 21 окт 2005, 03:16
Откуда: было оттуда, теперь отсюда

Сообщение AlexK »

Таблица елементарная, типа такого:

Код: Выделить всё

CREATE TABLE [dbo].[TableNames] (
	ID int IDENTITY (1, 1) NOT NULL ,
	tableName nvarchar (50)  
) ON [PRIMARY]
GO
Пример можно? Что имеется виду под "комплексным запросом"?
ura
Житель
Сообщения: 915
Зарегистрирован: 09 мар 2003, 22:46

Сообщение ura »

А что, все таблицы имеюь одинаковую структуру, например имеют такое поле someid?
Если да, то решение в лоб это хранимая процедура которая создает курсор с именами таблиц, бежит по ним и вызывает запрос на удаление для каждой таблицы.

Пример я сейчас не наваяю, но в примерах самого SQL это должно быть.
Vovchik
Маньяк
Сообщения: 2843
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Re: MS SQL Server 2000 вопросик

Сообщение Vovchik »

AlexK писал(а):Есть таблица с именами других таблиц.

Нужно сделать

foreach TableName
delete from TableName where someid=x


Такое возможно сделать в самом SQLе?

thx
Select 'delete from ' + table_name + ' where someid = x' from source_table

Результат сохранить в файл. ПОлучишь сикуел файл в котором будет много таких команд чилом равным количеству таблиц.
Vovchik
Маньяк
Сообщения: 2843
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

ura писал(а):Это можно оформить как хранимую процедуру,
сначала сделать запрос по нужной таблице, пройтись по ней или составить комплексный запрос и выполнить его. Одной командой боюсь не обойтись, но надо смотреть на исходную таблицу.
Токма ему придется использовать динамический сикуел.
ura
Житель
Сообщения: 915
Зарегистрирован: 09 мар 2003, 22:46

Сообщение ura »

Токма ему придется использовать динамический сикуел.
Так если только средствами SQL, значит как понимается или одним запросом или процедурой.
Vovchik
Маньяк
Сообщения: 2843
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

ura писал(а):
Токма ему придется использовать динамический сикуел.
Так если только средствами SQL, значит как понимается или одним запросом или процедурой.
В запросе ты хрен сделаешь. А в процедуре мона сделать динамический сикуел. Токма придется попыхтеть малость.
AlexK
Пользователь
Сообщения: 118
Зарегистрирован: 21 окт 2005, 03:16
Откуда: было оттуда, теперь отсюда

Сообщение 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
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

Сообщение Lepsik »

exec sp_MSforeachtable
Yuri Dimant
Пользователь
Сообщения: 107
Зарегистрирован: 02 авг 2004, 22:00

sql

Сообщение Yuri Dimant »

Lepcik-Celko, ты бы хоть пояснял давая такие советы что эта процедура is undocumented and usupported
AlexK
Пользователь
Сообщения: 118
Зарегистрирован: 21 окт 2005, 03:16
Откуда: было оттуда, теперь отсюда

Сообщение AlexK »

да дело даже не в этом, там определенный набор таблиц надо было обнулить, а не foreachtable. но за желание помочь спасибо :)
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

Re: sql

Сообщение 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 ?'
Ответить