تحقق مما إذا كان الجدول موجودا في SQL Server
-
03-07-2019 - |
سؤال
أود أن يكون هذا في نهاية المطاف النقاش حول كيفية التحقق إذا كان الجدول موجودا في SQL Server 2000/2005 باستخدام عبارات SQL.
عند جوجل عن الجواب ، يمكنك الحصول على الكثير من إجابات مختلفة.هل هناك مسؤول/الخلف وإلى الأمام متوافق طريقة لفعل ذلك ؟
هناك طريقتان يمكن من القيام بذلك.وهو واحد من بين اثنين هو المعيار/أفضل طريقة للقيام بذلك ؟
الطريقة الأولى:
IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
الطريقة الثانية:
IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
الخلية يوفر بسيطة
SHOW TABLES LIKE '%tablename%';
البيان.أنا أبحث عن شيء مشابه.
المحلول
للاستفسارات مثل هذا فمن الأفضل دائما أن استخدام INFORMATION_SCHEMA
عرض.هذه الآراء (في الغالب) القياسية في العديد من قواعد البيانات المختلفة و نادرا ما تتغير من نسخة إلى نسخة.
للتحقق مما إذا كان الجدول موجودا استخدام:
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'TheSchema'
AND TABLE_NAME = 'TheTable'))
BEGIN
--Do Stuff
END
نصائح أخرى
لاحظ أيضا أنه إذا كان لأي سبب من الأسباب كنت تحتاج إلى التحقق من جدول مؤقت يمكنك القيام بذلك:
if OBJECT_ID('tempdb..#test') is not null
--- temp table exists
ونحن دائما استخدام OBJECT_ID
أسلوب لطالما أتذكر
IF OBJECT_ID('*objectName*', 'U') IS NOT NULL
الرجاء راجع أدناه النهج ،
النهج 1:باستخدام INFORMATION_SCHEMA.عرض الجداول
يمكننا كتابة استعلام مثل أدناه لمعرفة ما إذا كان العملاء جدول موجود في قاعدة البيانات الحالية.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
PRINT 'Table Exists'
END
النهج 2:باستخدام OBJECT_ID() وظيفة
يمكننا استخدام OBJECT_ID() وظيفة ترغب أدناه لمعرفة ما إذا كان العملاء جدول موجود في قاعدة البيانات الحالية.
IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
النهج 3:باستخدام sys.الكائنات عرض الكتالوج
يمكننا استخدام Sys.الكائنات كتالوج عرض للتحقق من وجود الجدول كما هو مبين أدناه:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
النهج 4:باستخدام sys.طاولات عرض الكتالوج
يمكننا استخدام Sys.الجداول فهرس أجل التحقق من وجود الجدول كما هو مبين أدناه:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'Customers' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
النهج 5:تجنب استخدام sys.sysobjects نظام الجدول
يجب تجنب استخدام sys.sysobjects نظام الجدول مباشرة, إمكانية الوصول المباشر إلى أنه سيتم إهمال في بعض الإصدارات المستقبلية من Sql Server.كما في مايكروسوفت بول الرابط, مايكروسوفت تقترح استخدام كتالوج آراء sys.الكائنات/sys.الجداول بدلا من sys.sysobjects نظام الجدول مباشرة.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
أشار من: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
أبحث عن جدول في قاعدة بيانات مختلفة:
if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
print 'Exists'
أردت فقط أن أذكر حالة واحدة حيث سيكون أسهل قليلا إلى استخدام OBJECT_ID
الأسلوب.على INFORMATION_SCHEMA
الآراء هي كائنات تحت كل قاعدة البيانات
المعلومات مخطط وجهات النظر المحددة في مخطط اسمه INFORMATION_SCHEMA.هذا المخطط هو الوارد في كل قاعدة البيانات.
https://msdn.microsoft.com/en-us/library/ms186778.aspx
ولذلك جميع الجداول يمكنك الوصول إليها باستخدام
IF EXISTS (SELECT 1
FROM [database].INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
سوف لا تعكس إلا ما هو في [database]
.إذا أردت أن تحقق إذا كان في الجداول آخر قاعدة بيانات موجودة ، دون حيوي تغيير [database]
في كل مرة ، OBJECT_ID
سوف تتيح لك القيام بذلك في الخروج من مربع.السابق
IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
يعمل فقط وكذلك
IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
SQL SERVER 2016 تحرير:
بدءا من 2016, Microsoft مبسطة القدرة على التحقق من كائنات غير موجودة قبل أن يسقط ، عن طريق إضافة if exists
الكلمات الرئيسية drop
التصريحات.على سبيل المثال ،
drop table if exists mytablename
وسوف نفعل نفس الشيء OBJECT_ID
/ INFORMATION_SCHEMA
مغلفة في 1 سطر من التعليمات البرمجية.
IF OBJECT_ID('mytablename') IS NOT NULL
باستخدام المعلومات مخطط SQL القياسية طريقة للقيام بذلك ، لذلك ينبغي أن تستخدم من قبل جميع قواعد البيانات التي تدعم ذلك.
إذا كنت بحاجة إلى العمل على قواعد بيانات مختلفة:
DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'
DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'
DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_CATALOG = @Catalog
AND TABLE_SCHEMA = @Schema
AND TABLE_NAME = @Table))
BEGIN
--do stuff
END
IF EXISTS
(
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]')
AND
type in (N'U')
)
BEGIN
-- Do whatever you need to here.
END
هنا في التعليمات البرمجية أعلاه ، اسم الجدول Mapping_APCToFANavigator
.
أنا أعرف أنها مسألة قديمة ولكن لقد وجدت هذا الاحتمال إذا كنت تخطط يطلق عليه في كثير من الأحيان.
create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go
فقط إضافة هنا ، لصالح المطورين الزميل دباس
السيناريو الذي يتلقى @Tablename كمعلمة
(والتي قد أو قد لا يحتوي على schemaname) وإرجاع المعلومات أدناه إذا كان المخطط.الجدول موجود:
the_name object_id the_schema the_table the_type
[Facts].[FactBackOrder] 758293761 Facts FactBackOrder Table
أنا أنتجت هذا البرنامج النصي ليتم استخدامها داخل النصوص الأخرى في كل مرة كنت بحاجة إلى اختبار ما إذا كان أو لم يكن الجدول أو طريقة العرض موجود, وعندما تفعل ذلك, الحصول على object_id استخدامها لأغراض أخرى.
فإنه يثير خطأ عندما تقوم أنت تمرير سلسلة فارغة ، خطأ اسم المخطط أو خطأ اسم الجدول.
هذا يمكن أن يكون داخل الإجراء والعودة -1 على سبيل المثال.
كمثال لدي جدول يسمى "حقائق.FactBackOrder" في واحدة من بلدي مستودع البيانات قواعد البيانات.
هذا هو كيف حققت هذا:
PRINT 'THE SERVER IS ' + @@SERVERNAME
--select db_name()
PRINT 'THE DATABASE IS ' + db_NAME()
PRINT ''
GO
SET NOCOUNT ON
GO
--===================================================================================
-- @TableName is the parameter
-- the object we want to deal with (it might be an indexed view or a table)
-- the schema might or might not be specified
-- when not specified it is DBO
--===================================================================================
DECLARE @TableName SYSNAME
SELECT @TableName = 'Facts.FactBackOrder'
--===================================================================================
--===================================================================================
DECLARE @Schema SYSNAME
DECLARE @I INT
DECLARE @Z INT
SELECT @TableName = LTRIM(RTRIM(@TableName))
SELECT @Z = LEN(@TableName)
IF (@Z = 0) BEGIN
RAISERROR('Invalid @Tablename passed.',16,1)
END
SELECT @I = CHARINDEX('.',@TableName )
--SELECT @TableName ,@I
IF @I > 0 BEGIN
--===================================================================================
-- a schema and table name have been passed
-- example Facts.FactBackOrder
-- @Schema = Fact
-- @TableName = FactBackOrder
--===================================================================================
SELECT @Schema = SUBSTRING(@TABLENAME,1,@I-1)
SELECT @TableName = SUBSTRING(@TABLENAME,@I+1,@Z-@I)
END
ELSE BEGIN
--===================================================================================
-- just a table name have been passed
-- so the schema will be dbo
-- example Orders
-- @Schema = dbo
-- @TableName = Orders
--===================================================================================
SELECT @Schema = 'DBO'
END
--===================================================================================
-- Check whether the @SchemaName is valid in the current database
--===================================================================================
IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.SCHEMATA K WHERE K.[SCHEMA_NAME] = @Schema ) BEGIN
RAISERROR('Invalid Schema Name.',16,1)
END
--SELECT @Schema as [@Schema]
-- ,@TableName as [@TableName]
DECLARE @R1 TABLE (
THE_NAME SYSNAME
,THE_SCHEMA SYSNAME
,THE_TABLE SYSNAME
,OBJECT_ID INT
,THE_TYPE SYSNAME
,PRIMARY KEY CLUSTERED (THE_SCHEMA,THE_NAME)
)
;WITH RADHE_01 AS (
SELECT QUOTENAME(SCHEMA_NAME(O.schema_id)) + '.' + QUOTENAME(O.NAME) AS [the_name]
,the_schema=SCHEMA_NAME(O.schema_id)
,the_table=O.NAME
,object_id =o.object_id
,[the_type]= CASE WHEN O.TYPE = 'U' THEN 'Table' ELSE 'View' END
from sys.objects O
where O.is_ms_shipped = 0
AND O.TYPE IN ('U','V')
)
INSERT INTO @R1 (
THE_NAME
,THE_SCHEMA
,THE_TABLE
,OBJECT_ID
,THE_TYPE
)
SELECT the_name
,the_schema
,the_table
,object_id
,the_type
FROM RADHE_01
WHERE the_schema = @Schema
AND the_table = @TableName
IF (@@ROWCOUNT = 0) BEGIN
RAISERROR('Invalid Table Name.',16,1)
END
ELSE BEGIN
SELECT THE_NAME
,THE_SCHEMA
,THE_TABLE
,OBJECT_ID
,THE_TYPE
FROM @R1
END
في SQL Server 2000 يمكنك محاولة:
IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
SELECT 1 AS 'res'
END
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'PutSchemaHere'
AND
TABLE_NAME = 'PutTableNameHere'
)
IF OBJECT_ID (N'dbo.T', N'U') IS NOT NULL BEGIN print 'deleted table'; drop table t END else begin print 'table not found' end Create table t (id int identity(1,1) not null, name varchar(30) not null, lastname varchar(25) null) insert into t( name, lastname) values('john','doe'); insert into t( name, lastname) values('rose',NULL); Select * from t 1 john doe 2 rose NULL -- clean drop table t
شيء مهم أن نعرف على أي شخص لم تجد حلا حتى الآن:SQL server != الخلية.إذا كنت تريد أن تفعل ذلك مع الخلية, هو بسيط جدا
$sql = "SELECT 1 FROM `db_name`.`table_name` LIMIT 1;";
$result = mysql_query($sql);
if( $result == false )
echo "table DOES NOT EXIST";
else
echo "table exists";
نشر هذا هنا لأنه ضرب أعلى في جوجل.
select name from SysObjects where xType='U' and name like '%xxx%' order by name
-- -- إنشاء الإجراء للتحقق مما إذا كان الجدول موجود
DELIMITER $$
DROP PROCEDURE IF EXISTS `checkIfTableExists`;
CREATE PROCEDURE checkIfTableExists(
IN databaseName CHAR(255),
IN tableName CHAR(255),
OUT boolExistsOrNot CHAR(40)
)
BEGIN
SELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLES
WHERE (TABLE_SCHEMA = databaseName)
AND (TABLE_NAME = tableName);
END $$
DELIMITER ;
-- -- كيفية استخدام :تحقق مما إذا كان الجدول الهجرات موجود
CALL checkIfTableExists('muDbName', 'migrations', @output);
IF EXISTS ( SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'dbo.TableName') AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
BEGIN
SELECT * FROM dbo.TableName;
END
GO
إذا كان أي شخص يحاول أن يفعل نفس الشيء في linq to sql (أو خاصة linqpad) تشغيل الخيار لتضمين نظام الجداول و الآراء و هل هذا الكود:
let oSchema = sys.Schemas.FirstOrDefault(s=>s.Name==a.schema )
where oSchema !=null
let o=oSchema!=null?sys.Objects.FirstOrDefault (o => o.Name==a.item && o.Schema_id==oSchema.Schema_id):null
where o!=null
بالنظر إلى أن لديك كائن مع اسم في خاصية تسمى البند المخطط في خاصية تسمى المخطط حيث المصدر اسم المتغير هو a
إذا كان هذا هو في نهاية المطاف المناقشة ، ثم وتجدر الإشارة إلى أن لاري ليونارد النصي يمكن الاستعلام ملقم بعيد وكذلك إذا كانت ملقمات المرتبطة.
if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
print 'Exists'
عندي بعض المشاكل سواء مع اختيار من INFORMATIONAL_SCHEME و OBJECT_ID.أنا لا أعرف إذا كان إصدار من برنامج تشغيل ODBC أو أي شيء..استفسارات SQL server إدارة studio, كلا, لا بأس.
هنا هو الحل:
SELECT COUNT(*) FROM <yourTableNameHere>
حتى لو يفشل الاستعلام, هناك, ربما, لا يوجد مثل هذا الجدول في قاعدة البيانات (أو لم يكن لديك أذونات الوصول إلى ذلك).
الاختيار يتم عن طريق مقارنة قيمة (عدد صحيح في حالتي) عاد SQL المنفذ الذي يتعامل مع برنامج تشغيل ODBC..
if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
// myTable doesn't exist..
}
تشغيل هذا الاستعلام للتحقق إذا كان الجدول موجود في قاعدة البيانات:
IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE
TABLE_CATALOG = 'Database Name' and
TABLE_NAME = 'Table Name' and
TABLE_SCHEMA = 'Schema Name') -- Database and Schema name in where statement can be deleted
BEGIN
--TABLE EXISTS
END
ELSE BEGIN
--TABLE DOES NOT EXISTS
END
النظر في قاعدة بيانات واحدة لديك جدول t1.كنت ترغب في تشغيل البرنامج النصي في قاعدة بيانات أخرى مثل - إذا t1 موجودة ثم لا تفعل شيئا آخر إنشاء t1.للقيام بذلك فتح visual studio ثم قم بما يلي:
انقر بزر الماوس الأيمن على t1, ثم النصي الجدول ، ثم إسقاط وخلق ، ثم استعلام جديد محرر
سوف تجد المطلوب الاستعلام.ولكن قبل تنفيذ هذا السيناريو لا تنسى التعليق من الهبوط البيان في الاستعلام كما كنت لا ترغب في إنشاء واحدة جديدة إذا كان هناك بالفعل واحدة.
شكرا