برمجة SQL Server - تحديث جميع التواريخ بعدد معين من الأيام
-
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
نهاية
المحلول
فهمك صحيح.يبدو أن القطع التي تفتقدها هي:
- كيفية العثور على البيانات الوصفية (ما الجداول لقد حصلت ، وما الأعمدة)
- كيفية بناء 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
وبعد ذلك يذهب إلى الأمام وتحديث كل عمود في مجموعة النتائج الخاصة بكل الطاولة، تليها تمكين المشغلات.
وهتافات