سؤال

حسنا, لذلك Sybase (12.5.4) سوف اسمحوا لي أن تفعل ما يلي إلى إسقاط الجدول إذا كان موجودا بالفعل:

IF EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
DROP TABLE a_table
GO

ولكن إذا كنت تحاول أن تفعل الشيء نفسه مع إنشاء جدول, أنا دائما على حذر من أن الجدول موجود بالفعل ، لأنها ذهبت و حاولت إنشاء الجدول و تجاهلت عبارة شرطية.مجرد محاولة تشغيل العبارة التالية مرتين ، سترى ما أعنيه:

IF NOT EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
CREATE TABLE a_table (
    col1 int not null,
    col2 int null
)
GO

تشغيل أعلاه ينتج الخطأ التالي:

خطأ SQL Server على (localhost) خطأ:2714 في السطر:7 الرسالة:هناك بالفعل كائن اسمه 'a_table' في قاعدة البيانات.

ما هو التعامل مع ذلك؟!

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

المحلول

والحل الوحيد جئت مع حتى الآن هو استخدام تنفيذ فوري:

IF NOT EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
EXECUTE("CREATE TABLE a_table (
    col1 int not null,
    col2 int null
)")
GO

وتعمل مثل السحر، وكأننا الإختراق القذرة.

نصائح أخرى

وليس هناك وسيلة أخرى من يدعو create table في execute("create table ...")

ودليل SYBASE يقول:

<اقتباس فقرة>   

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

if not exists
    (select * from sysobjects where name="my table")
begin
execute "create table mytable(x int)"
end

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

وتعيين "CREATE TABLE" بيان فيvariable شار ثم القيام EXEC (variable).

إذا كنت تريد دائما لإنشاء الجدول، ولكن بشروط تسقطها، يمكنك استخدام:

IF(SELECT count(*) FROM sysobjects WHERE name="tableNameWithoutUserPart") > 0
    DROP TABLE tableNameWithUserPart
GO

CREATE TABLE tableNameWithUserPart ...

لا توجد أي حلول الحاجة؛)

واستنادا إلى وثائق:

CREATE [ GLOBAL TEMPORARY ] TABLE [ IF NOT EXISTS ] [ owner.]table-name
( { column-definition | table-constraint | pctfree }, ... )
[ { IN | ON } dbspace-name ]
[ ENCRYPTED ]
[ ON COMMIT { DELETE | PRESERVE } ROWS
   | NOT TRANSACTIONAL ]
[ AT location-string ]
[ SHARE BY ALL ]

ومجرد استخدام IF NOT EXISTS.

IF object_id('a_table') IS NULL
BEGIN
    CREATE TABLE a_table (
        col1 int not null,
        col2 int null
    ) 
END

وهذا يعمل عند اختباره مع <القوي> سايبيس في أي مكان 10.01 : ل

if not exists(select * from SysColumns where tname = 'AAA') then create table DBA.AAA(  UNIQUEID integer not null ) END IF ;

حاول استخدام Begin و End.

إن لم يكن موجود ( حدد عدد(1) من sysobjects حيث name = 'a_table' و type = 'U' ) تبدأ إنشاء جدول a_table ( col1 int not null, col2 الباحث null ) نهاية الذهاب

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