PDA

View Full Version : حذف یک مقدار در کل بانک اطلاعاتی



ashena29
شنبه 06 اسفند 1384, 12:05 عصر
دوستان چگونه می توان یک عبارت وارد شده در چندین جدول یک بانک اطلاعاتی را حذف نمود بطور مثال با یک تابع یا استور براسیجر بتوان عبارت "بدون انتخاب" موجود در تمامی جداول را یکباره حذف نمود پر واضح است که با دستور delete روی تک تک جداول می توان این کار را انجام داد ولی اگر خواسته باشیم این کار یکباره و با یک دستور صورت پذیرد را ه کار چیست با تشکر

Kamyar.Kimiyabeigi
شنبه 06 اسفند 1384, 14:13 عصر
شما میتونین با یک Select از sysobjects نام جداول رو استخراج کنین و با حلقه ایی که بر روی خروجی این select میزنین از تک تک جداول عبارت مورد نظرتونو پاک کنین (البته اگر این مقدار در تمام جداول در یک فیلد مشترک باشه)

Inspiration
شنبه 06 اسفند 1384, 15:23 عصر
این برنامه تمام جداول و تمام فیلدها را برای یافتن عبارت مورد نظر شما جستجو می کند. (البته لزومی نداره این مقدار در تمام جداول در یک فیلد مشترک باشه)


حالا من درست سوال رو نفهمیدم. می خواهید کل آن Row حذف شه , یا فقط همون عبارت پاک شه یا جایگزین شه......؟



CREATE PROC SearchAllTables
(
@SearchStr nvarchar(100)
)
AS
BEGIN
CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped'
) = 0
)

WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)

IF @ColumnName IS NOT NULL
BEGIN
INSERT INTO #Results
EXEC
(
'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)
FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
)
END
END
END

SELECT ColumnName, ColumnValue FROM #Results
END

Kamyar.Kimiyabeigi
شنبه 06 اسفند 1384, 15:37 عصر
DECLARE @Var_TableName VARCHAR(500)

DECLARE authors_cursor CURSOR FOR

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
ORDER BY TABLE_NAME
OPEN authors_cursor

FETCH NEXT FROM authors_cursor
INTO @Var_TableName

WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('DELETE FROM ' + @Var_TableName + ' WHERE YourField = ' + '''' + 'Value' + '''')

FETCH NEXT FROM authors_cursor
INTO @Var_TableName
END

CLOSE authors_cursor
DEALLOCATE authors_cursor
GO

البته شما بجای delete میتونین update بنویسید بسته به نیازتون

ashena29
یک شنبه 07 اسفند 1384, 10:02 صبح
با تشکر از دوستانی که به این موضوع پاسخ دادند هدف حذف آن عبارت از کل بانک اطلاعاتی می باشد نه حذف رکورد(row)به عبارتی update کردن آن عبارت با یک عبارت جدید
حال اگر دوستان عزیز توضیح مختصری در مورد راه حل پیشنهادی می دادند ممنون می شوم که مثلا" عبارت مورد نظر در کجای کد قرار داده شود
درضمن لازم به توضیح است که نام فیلدها در جداول گوناگون با یکدیگر یکسان نیست

Kamyar.Kimiyabeigi
یک شنبه 07 اسفند 1384, 10:19 صبح
DECLARE @Var_TableName VARCHAR(500)

DECLARE authors_cursor CURSOR FOR

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
ORDER BY TABLE_NAME
OPEN authors_cursor

FETCH NEXT FROM authors_cursor
INTO @Var_TableName

WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('UPDATE ' + @Var_TableName + ' SET &nbsp = NULL WHERE &nbsp = ' + '''' + 'بدون انتخاب' + '''')

FETCH NEXT FROM authors_cursor
INTO @Var_TableName
END

CLOSE authors_cursor
DEALLOCATE authors_cursor
GO

این script هم برای update کردنه با فرض اینکه نام فیلدتون &nbsp باشه
خوش باشی