MSSQL: كيف النصي إجراء مخزن إنشاء مع رمز؟
-
21-08-2019 - |
سؤال
وأنا أحاول أن الاستعلام عن قائمة تعريفات الإجراء المخزن باستخدام information_schema.routines الموجودة في قاعدة بيانات واحدة ولكن ليس في بلد آخر.
SELECT
t1.Routine_Definition
FROM
[server1].MyDatabase.INFORMATION_SCHEMA.Routines t1
LEFT JOIN
[server2].MyDatabase.INFORMATION_SCHEMA.Routines t2 ON t1.Routine_Name = t2.Routine_Name
WHERE
t2.Routine_Name is null
و
هذا يعطيني تعريفات الاستعلام في سطر واحد حتى عندما يكون لدي تعليق مثل هذا
--Some comment
SELECT Column
FROM Somewhere
ويحصل علق SQL خارجا وأنا لا يمكن استخدام تعريف لإنشاء SP.
وكيف يمكنني تحليل هذه العودة مع فواصل الأسطر المناسبة؟
أو
هل هناك طريقة أفضل للحصول على هذه البرامج النصية (باستخدام كود)؟
المحلول
ويتم عرض الإجراء المخزن فقط على سطر واحد في إدارة Studio. إذا قمت بتشغيل الاستعلام مع النتائج إلى النص، أو استخدام ما يلي، سوف تحصل الخط الصحيح فواصل:
declare @sql varchar(8000) -- varchar(max) in SQL 2005+
SELECT
@sql = t1.Routine_Definition
FROM
INFORMATION_SCHEMA.Routines t1
print @sql
نصائح أخرى
DECLARE MY_CURSOR Cursor
FOR
SELECT
t1.Routine_Definition
FROM
[server1].MyDatabase.INFORMATION_SCHEMA.Routines t1
LEFT JOIN
[server2].MyDatabase.INFORMATION_SCHEMA.Routines t2 ON t1.Routine_Name = t2.Routine_Name
WHERE
t2.Routine_Name is null AND
LEN(t1.Routine_Definition) < 4000
Open My_Cursor
DECLARE @sql VARCHAR(MAX)
FETCH NEXT FROM MY_Cursor INTO @sql
While (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
Print @sql
FETCH NEXT FROM MY_CURSOR INTO @sql
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
GO
وهنا هو كيف لي أن تنفيذ حل المسيخ في ...
والرأي INFORMATION_SCHEMA يعود فقط الأحرف 4000 الأولى في التعريف. (ومن الناحية المثالية لديك متعود SP التي هي فترة طويلة) هل تريد أن السيناريو تلك يدويا أو بطريقة أخرى.
وأعتقد أن أسهل طريقة للحصول على الإجراءات المخزنة لاستخدام أداة الاستيراد / التصدير المضمن في SQL Server إدارة Studio. من هناك يمكنك تصدير بك كائنات إجراء مخزن في إطار التعليمات البرمجية أو إلى ملف التي يمكن تشغيلها على الفور.