برمجة SQL Server - تحديث جميع التواريخ بعدد معين من الأيام

StackOverflow https://stackoverflow.com/questions/1076359

  •  21-08-2019
  •  | 
  •  

سؤال

لدي قاعدة بيانات تجريبية تحتوي على بضع مئات من الجداول.يحتوي كل جدول عادةً على حقل واحد على الأقل يسمى tstamp وهو نوع بيانات صغير للتاريخ والوقت.تحتوي بعض الجداول على حقول بيانات أخرى أيضًا.تحتوي العديد من الجداول أيضًا على مشغل واحد أو أكثر.

لقد كتبت برنامجًا نصيًا (بالطريقة الصعبة - انظر أدناه) لزيادة حقول التاريخ في كل جدول بعدد معين من الأيام.والفكرة هي جعل البيانات تبدو أكثر "حداثة" عن طريق تحديث جميع التواريخ بنفس المقدار من الأيام.

أنا متأكد من أن هناك طريقة أسهل للقيام بذلك عن طريق التكرار فوق جدول النظام لتحديد كل جدول مستخدم في قاعدة البيانات، وتعطيل جميع المشغلات عليه، وتعديل كل حقل تاريخ ووقت صغير عن طريق إضافة عدد الأيام إليه، وإعادة تمكين المشغلات والانتقال إلى الجدول التالي.ليس لدي أي فكرة عن كيفية كتابة مثل T-SQL.

أي من الأشخاص يود ذلك؟

شكرًا.جو

نموذج البرنامج النصي:

DECLARE @numDaysToAdd int

SET @numDaysToAdd = 100

ALTER TABLE someTableDISABLE TRIGGER someTrigger

UPDATE someTable
SET tstamp = DATEADD(day, @numDaysToAdd, tstamp)

-- update any other smalldatetime field in the table too.

ALTER TABLE someTable ENABLE TRIGGER someTrigger

-- same pattern for 200 more tables!

================================================== ======= يتعلق الأعمال:

أعلن @numDaysToAdd int

تعيين @numDaysToAdd = 1

إذا @numDaysToAdd > 0

يبدأ

أعلن @tablename varchar(100)

أعلن @currtable varchar(100)

أعلن @currcolumn varchar(100)

أعلن @columnname varchar(100)

أعلن @strSQL nvarchar(4000)

قم بتعريف tnames_cursor CURSOR

ل

حدد t.TABLE_NAME، c.COLUMN_NAME

FROM INFORMATION_SCHEMA.COLUMNS c انضم إلى INFORMATION_SCHEMA.TABLES t ON t.TABLE_NAME = c.TABLE_NAME

أين (c.DATA_TYPE = 'smalldatetime' أو c.DATA_TYPE = 'datetime') وt.TABLE_TYPE<>'VIEW'

ORDER BY t.TABLE_NAME، c.COLUMN_NAME DESC

افتح tnames_cursor

جلب التالي من tnames_cursor إلى @tablename، @columnname

SET @currcolumn = @columnname

SET @currtable = @tablename

SET @strSQL = N'UPDATE ' + @tablename + CHAR(13)+CHAR(10) + 'SET' + @columnname + ' = DATEADD(day, ' + CONVERT(varchar(10),@numDaysToAdd) + ', ' + @اسم العمود + ')'

بينما (@@FETCH_STATUS = 0)

يبدأ

إذا (@currtable = @tablename)

BEGIN     

  IF @currcolumn <> @columnname

    SET @strSQL = @strSQL + N',' + CHAR(13)+CHAR(10) + @columnname + ' = DATEADD(day, ' + CONVERT(varchar(10),@numDaysToAdd) + ', ' + @columnname + ')'
END

آخر

BEGIN    

  SET @currtable = @tablename

  SET @currcolumn = @columnname

  EXEC sp_executesql @strSQL

  SET @strSQL = N'UPDATE ' + @tablename + CHAR(13)+CHAR(10) + 'SET ' + @columnname + ' = DATEADD(day, ' + CONVERT(varchar(10),@numDaysToAdd) + ', ' + @columnname + ')' 

END

جلب التالي من tnames_cursor إلى @tablename، @columnname

نهاية

-تشغيل البيان النهائي exec sp_executesqltStql

إغلاق tnames_cursor

إلغاء تخصيص tnames_cursor

نهاية

هل كانت مفيدة؟

المحلول

فهمك صحيح.يبدو أن القطع التي تفتقدها هي:

  1. كيفية العثور على البيانات الوصفية (ما الجداول لقد حصلت ، وما الأعمدة)
  2. كيفية بناء SQL للسير فوق الطاولات.

بالنسبة للرقم 1، راجع طرق عرض النظام INFORMATION_SCHEMA.TABLES و INFORMATION_SCHEMA.COLUMNS:

-- add your own additional criteria
select t.TABLE_NAME, c.COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS c
join INFORMATION_SCHEMA.TABLES t ON t.TABLE_NAME = c.TABLE_NAME
WHERE c.DATA_TYPE = 'datetime'

بالنسبة للرقم 2، يمكنك إنشاء عبارة SQL كسلسلة، والتنقل عبر الجداول التي تهمك، ثم تنفيذها باستخدام sp_executesql.

نصائح أخرى

وأنا أتفق. وثمة خيار آخر هو استخدام جداول النظام لتوليد مزود لكافة الجداول 200. ثم يمكنك استخدام sp_execsql إلى إكسيك. لن يغير إعدام ولكن سيوفر لك الكتابة، التي هي دائما أهمية:)

والاستعلام التالي شأنه أن يوفر لك قائمة الجداول المستخدم وأعمدتها التي هي من نوع 'smallDateTime ".

SELECT sys.columns.name as tableName, sys.tables.name as columnName from sys.columns,sys.tables 
where sys.columns.object_id=sys.tables.object_id and sys.columns.system_type_id=58 order by tableName

وهنا system_type_id 58 نوع البيانات - smallDateTime. يمكنك التحقق من ذلك من الجدول sys.types.

وباستخدام المؤشر قد يكون يمكنك تكرار عبر مجموعة النتائج للحصول على كل جدول ثم تعطيل المشغلات على هذا الجدول. تحقق هذا لتعطيل الزناد / تمكين http://msdn.microsoft.com/en -US / مكتبة / ms189748.aspx

وبعد ذلك يذهب إلى الأمام وتحديث كل عمود في مجموعة النتائج الخاصة بكل الطاولة، تليها تمكين المشغلات.

وهتافات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top