SQL සේවාදායකයේ වගුව තිබේදැයි පරීක්ෂා කරන්න


1161

SQL ප්‍රකාශන 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;

MySQL සරල දේ සපයයි

SHOW TABLES LIKE '%tablename%'; 

ප්රකාශය. මම ඒ හා සමාන දෙයක් සොයමි.


1
Sys.tables වෙනුවට INFORMATION_SCHEMA.TABLES භාවිතා කිරීම වඩාත් සුදුසු වන්නේ ඇයි? පසුව නම සමඟ පෙරහන් කරන්න.
ඩැන්ටේ ස්මිත්

Answers:


1363

මෙවැනි විමසීම් සඳහා සෑම විටම INFORMATION_SCHEMAදර්ශනයක් භාවිතා කිරීම වඩාත් සුදුසුය . මෙම අදහස් විවිධ දත්ත සමුදායන් හරහා (බොහෝ දුරට) සම්මත වන අතර කලාතුරකින් අනුවාදයේ සිට අනුවාදයට වෙනස් වේ.

වගුවක් තිබේදැයි පරීක්ෂා කිරීමට භාවිතා කරන්න:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END

12
නියමයි! T-SQL හි (මුල් පෝස්ටරයට ප්‍රතිචාර වශයෙන්), එය TABLE_SCHEMA මිස SCHEMA_NAME නොවේ. ඔත්තුවට ස්තූතියි.
නිකලස් පියසෙක්කි

10
වස්තුවක නමක් පමණක් (එනම්, යෝජනා ක්‍රමයක් නොමැතිව) අද්විතීය බව සහතික කර නොමැති හෙයින්, මෙය කිරීමට 100% අසමත් ආරක්ෂිත ක්‍රමයක් නොමැත. ඔබ ක්‍රමානුකූලව නම් කිරීමේ ගැටුම් නොමැති ඩීබී සමඟ වැඩ කරන්නේ නම් "TABLE_SCHEMA = 'TheSchema' 'මඟ හැරීම හොඳින් ක්‍රියාත්මක වේ.
akmad

26
තාවකාලික වගුවක් පරික්ෂා කිරීම සඳහා, අපට tempdb දත්ත සමුදාය විමසා මේසයේ නම සඳහා LIKE ක්‍රියාකරු භාවිතා කළ යුතුයSELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
පියරේ-ඇලන් විජියන්ට්

4
OBJECT_ID ශ්‍රිතය භාවිතා කරන පහත ප්‍රතිචාරයක් එක් සම්බන්ධතා තාවකාලික වගු සම්බන්ධයෙන් නිවැරදිව ක්‍රියාත්මක වේ - stackoverflow.com/a/2155299/16147
පොහොසත් රූසෝ

4
@akmad SQL විමසුම් සම්පාදකය විමසුම ක්‍රියාත්මක කිරීමට පෙර වගුව සඳහා පරීක්ෂා කරනු ඇති අතර එය ආරම්භ කිරීමට පෙර අසාර්ථක වනු ඇත.
මාක් කේ

283

කිසියම් හේතුවක් නිසා ඔබට තාවකාලික වගුවක් පරීක්ෂා කිරීමට අවශ්‍ය නම් ඔබට මෙය කළ හැකි බව සලකන්න.

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists

12
මෙම ක්‍රමය භාවිතා කිරීම තාවකාලික වගු වල එක් එක් සම්බන්ධතා ස්වභාවයට ගරු කරන බව පෙනේ. කලින් පළ කරන ලද INFORMATION_SCHEMA විමසුම මඟින් වගුව නිර්මාණය කළ සම්බන්ධතාවය නොසලකා පේළි ලබා දෙනු ඇත.
පොහොසත් රූසෝ

245

OBJECT_IDමට මතක ඇති තාක් කල් අපි සෑම විටම විලාසිතාව භාවිතා කරමු

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 

16
ඉතා අතේ ගෙන යා නොහැකි වුවද මෙය වේගවත් වනු ඇතැයි මම විශ්වාස කරමි. ප්‍රමිතියට සහය දක්වන ඕනෑම ඩීබීආර්එම්එස් මත තොරතුරු ක්‍රමලේඛන අදහස් සහතික වේ. තව දුරටත්, සරල OBJECT_ID වස්තුවේ වගුවක් සහතික නොකරයි.
ජෝ පිනෙඩා

9
ස්තූතියි ජෝ, මම කල්පනා කළේ ඔබ OBJECT_ID එදිරිව INFORMATION_SCHEMA.TABLES එදිරිව sys.tables භාවිතා කරන්නේ ඇයි කියායි. INFORMATION_SCHEMA යනු සම්මතයක කොටසක් බව පෙන්වා දෙමින් එම ප්‍රශ්නයට පිළිතුරු සපයයි. BTW එය විහිලුවක්, අපගේ දත්ත සමුදා විශේෂ experts යෙකුගෙන් මා මෙම ප්‍රශ්නය ඇසීමට යන්නේ ඔබ හා සමාන අන්තිම නමක් ඇති නිසාය, දත්ත සමුදායන් සඳහා හොඳ අවසාන නමක් විය යුතුය.
Apeiron

24
Oe ජෝපීනෙඩා: එවිට ඔබ OBJECT_ID('TableName', 'U')වස්තුව වගුවක් බව සහතික කිරීමට භාවිතා කරයි.
ඇලන් ගුරල්නෙක්

1
L ඇලන්ගුරල්නෙක් එසේ නම්, සරල හා අතේ ගෙන යා හැකි ප්‍රමිතියක් අනුගමනය කරනවා වෙනුවට, ගුප්ත තොරතුරු අමතර කොටසක් එකතු කරන්න?
අර්ථ දක්වයි

23
UstDustinFineout: ප්‍රශ්නය tsql ලෙස ටැග් කර ඇති බැවින් අතේ ගෙන යා හැකි තරම් අදාළ නොවේ. පොදුවේ ගත් කල මට සැබවින්ම අතේ ගෙන යා හැකි කේත පදනම් කිහිපයක් හමු වී ඇති අතර සාරාංශය අගය කරන්නේ නම් IF EXISTSපිළිගත් පිළිතුරෙන් නැවත නැවතත් එම විමසුම ලිවීමට එය සමත් වේ. ප්ලස්, ඔබ ප්‍රලේඛනය කියවන තෙක් සෑම දෙයක්ම ගුප්ත වේ, විශේෂයෙන් ටී-එස්කියුඑල් (හෝ වෙනත් ඕනෑම ප්‍රභේදයක්, ඇත්ත වශයෙන්ම).
ඇලන් ගුරල්නෙක්

136

කරුණාකර පහත ප්‍රවේශයන් බලන්න,

ප්‍රවේශය 1: INFORMATION_SCHEMA.TABLES දර්ශනය භාවිතා කිරීම

වත්මන් දත්ත ගබඩාවේ පාරිභෝගික වගුවක් තිබේදැයි පරීක්ෂා කිරීමට අපට පහත වැනි විමසුමක් ලිවිය හැකිය.

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.Objects නාමාවලි දර්ශනය භාවිතා කිරීම

පහත දැක්වෙන පරිදි වගුවේ පැවැත්ම පරීක්ෂා කිරීමට අපට Sys.Objects නාමාවලි දර්ශනය භාවිතා කළ හැකිය:

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.Tables නාමාවලි දර්ශනය භාවිතා කිරීම

පහත දැක්වෙන පරිදි වගුවේ පැවැත්ම පරීක්ෂා කිරීමට අපට Sys.Tables නාමාවලි දර්ශනය භාවිතා කළ හැකිය:

 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 සේවාදායකයේ සමහර අනාගත සංස්කරණ වලදී එයට access ජු ප්‍රවේශය අහිමි වේ. මයික්‍රොසොෆ්ට් බීඕඑල් සබැඳියට අනුව, මයික්‍රොසොෆ්ට් විසින් sys.sysobjects පද්ධති වගුව වෙනුවට sys.objects / sys.tables නාමාවලි භාවිතා කිරීමට යෝජනා කරයි.

  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/


විශිෂ් post පෝස්ට්, ra බ්‍රේන් කෝඩර්
හාඩ්රිව්

37

වෙනත් දත්ත ගබඩාවක වගුවක් සොයමින්:

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'

29

OBJECT_IDක්‍රමවේදය භාවිතා කිරීම ටිකක් පහසු වන එක් තත්වයක් සඳහන් කිරීමට අවශ්‍ය විය . මෙම INFORMATION_SCHEMAඅදහස් එක් එක් database- යටතේ වස්තූන් වන

තොරතුරු ක්‍රමලේඛන අදහස් 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 සිට ඇරඹෙන මයික්‍රොසොෆ්ට්, ප්‍රකාශයන්ට if existsමූල පද එකතු කිරීමෙන්, අතහැර දැමීමට පෙර නොපවතින වස්තූන් පරීක්ෂා කිරීමේ හැකියාව සරල කළේය drop. උදාහරණයක් වශයෙන්,

drop table if exists mytablename

කේත පේළි 1 කින් OBJECT_ID/ INFORMATION_SCHEMAඑතීමට සමාන දේ කරනු ඇත.

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/



13

තොරතුරු යෝජනා ක්‍රමය භාවිතා කිරීම එය කිරීමට SQL සම්මත ක්‍රමය වන බැවින් එය සහාය දක්වන සියලුම දත්ත සමුදායන් විසින් එය භාවිතා කළ යුතුය.


13
මෙය අදහස් දැක්වීමක් විය යුතුව තිබුණි.
underscore_d

3
මෙම පිළිතුර වැඩිදියුණු කළ යුතුය.
rory.ap

11
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.


2
ඔබ කේත, එක්ස්එම්එල් හෝ දත්ත සාම්පල පළ කරන්නේ නම්, කරුණාකර එම සංස්කරණ පෙළ සංස්කාරකයේ උද්දීපනය { }කර සංස්කාරක මෙවලම් තීරුවේ ඇති “කේත සාම්පල” බොත්තම මත ක්ලික් කරන්න .
marc_s

1
SQL සේවාදායකයේ අනාගත අනුවාදයේදී පද්ධති වගු සඳහා ප්‍රවේශය අත්හිටුවිය හැකි බව සලකන්න. ඒ වෙනුවට යෝජනා ක්‍රම භාවිතා කරන්න.
ඔලිවියර් ජැකොට්-ඩෙස්කොම්බ්ස්

10

ඔබට විවිධ දත්ත සමුදායන් මත වැඩ කිරීමට අවශ්‍ය නම්:

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

1
ඔබට විශ්වාසද? මගේ 2005 කොටුවේ ඇති තොරතුරු ක්‍රමවේදය මඟින් වර්තමාන නාමාවලිය පමණක් ලබා දේ.
quillbreaker

9

ඔබට පහත කේතය භාවිතා කළ හැකිය

IF (OBJECT_ID('TableName') IS NOT NULL )
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

හෝ

IF (EXISTS (SELECT * FROM sys.tables WHERE [name] = 'TableName'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

8

එය පැරණි ප්‍රශ්නයක් බව මම දනිමි, නමුත් ඔබ එය නිතර ඇමතීමට අදහස් කරන්නේ නම් මෙම හැකියාව මට හමු විය.

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go

9
-1. තේරීමක් කිරීම සඳහා නැවත පැමිණීම ඇමතීමට හා පරිභෝජනය කිරීමට තරම් කේතයක් ඇති බැවින් මේ සඳහා ක්‍රියා පටිපාටියක් තිබීම අර්ථ විරහිත ය. sysnameඩේටා ටයිප් භාවිතා නොකළ යුතුය varchar(50). අතහැර sysobjectsදැමූ දසුන භාවිතා නොකළ යුතු අතර ක්‍රමෝපායන් සැලකිල්ලට නොගනී.
මාටින් ස්මිත්

5

සංවර්ධකයින්ගේ සහ සෙසු ඩී.බී.ඒ.

ableTablename පරාමිතියක් ලෙස ලැබෙන ස්ක්‍රිප්ටයකි

(එය යෝජනා ක්‍රමයේ අඩංගු විය හැකිය හෝ නොතිබිය හැක) සහ schema.table තිබේ නම් පහත තොරතුරු ලබා දෙයි:

the_name                object_id   the_schema  the_table       the_type
[Facts].[FactBackOrder] 758293761   Facts       FactBackOrder   Table

වගුවක් හෝ දර්ශනයක් තිබේද නැද්ද යන්න පරීක්ෂා කිරීමට අවශ්‍ය සෑම අවස්ථාවකම මම මෙම ස්ක්‍රිප්ට් වෙනත් ස්ක්‍රිප්ට් තුළ භාවිතා කිරීමට නිපදවා ඇති අතර, එසේ වූ විට එහි වස්තුව_අයිඩී වෙනත් අරමුණු සඳහා භාවිතා කරන්න.

එක්කෝ ඔබ හිස් නූලක්, වැරදි යෝජනා ක්‍රමයක් හෝ වැරදි වගු නාමයක් සම්මත කළ විට එය දෝෂයක් මතු කරයි.

මෙය ක්‍රියා පටිපාටියක් තුළ විය හැකි අතර උදාහරණයක් ලෙස -1 ආපසු එවන්න.

උදාහරණයක් ලෙස, මගේ එක් දත්ත ගබඩාවක දත්ත ගබඩාවක "Facts.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 

ඔබේ පිටපතෙහි බොහෝ උපකල්පන තිබේ. නිදසුනක් වශයෙන්, මට පහසුවෙන් නම් කළ වගුවක් සෑදිය හැකි dbo.[hello.world ]අතර විවිධ හේතු නිසා ස්ක්‍රිප්ට් එය සොයා නොගනී. එවැනි වගුවක් නිර්මාණය කිරීමට කිසිවෙකුට අවශ්‍ය නොවනු ඇතැයි සිතිය හැකිය, නමුත් තවමත්. කෙසේ වෙතත්, ඔබේ THE_NAMEතීරුව අර්ථ දැක්වෙන්නේ sysname', yet you try to squeeze 2 සිස්මේම් තීරු සහ තිතක් ( .), සියල්ලම එහි වර්ග වරහන් වලින් වටවී ඇත ... එය කවදා හෝ අසමත් වීමට බැඳී සිටී!
ඩෙරොබි

roderoby මම එකඟයි sysname භාවිතා කළ හැකි හොඳම දත්ත වර්ගය නොවන නමුත් තිර රචනය කිසිදු දෝෂයක් නොමැතිව දීර් time කාලයක් තිස්සේ ක්‍රියාත්මක වන අතර, මම ඒ සඳහා කාලය ගත කරන්නේ එය ක්‍රියාත්මක නොවන සාධාරණ තත්වයක් සොයාගතහොත් පමණි. ඊටත් වඩා හොඳයි, ඔබ මෙම කේතය ගෙන එය වැඩි දියුණු කර පිළිතුරක් ලෙස මෙහි පළ කරන්න. මම එය පරීක්ෂා කරමි, එය ක්‍රියාත්මක වන්නේ නම් මම ඔබේ පිළිතුර ඉහළට ඔසවන්නෙමි.
මාර්සෙලෝ මයොරෙලි

5

දී SQL Server 2000 ඔබට උත්සහ කරන්න පුළුවන්:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END

3
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)

2

ඔවුන්ගේ විසඳුම මෙතෙක් සොයාගෙන නොමැති ඕනෑම කෙනෙකුට දැන ගැනීමට වැදගත් දෙයක්: SQL සේවාදායකය! = MYSQL . ඔබට MYSQL සමඟ එය කිරීමට අවශ්‍ය නම් එය තරමක් සරල ය

    $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";

මෙය ගූගල්හි ඉහළින්ම වැජඹෙන නිසා මෙහි පළ කිරීම.


4
-1 මක් නිසාද යත්, OP හරියටම SQL සේවාදායකයේ විසඳුමක් ඉල්ලා සිටින අතර මිස MySQL එක නොවේ. ඔහු MySQL ගැන ලිව්වේ එම DBMS හි විසඳුම ඔහු දන්නා නිසා සහ SQL සේවාදායකයේ එම ප්‍රති result ලයම ඔහුට අවශ්‍ය වූ බැවිනි. ඔබේ පිළිතුර MySQL විමසුමක් නොව MySQL සමඟ ක්‍රියා කරන PHP කේතයකි.
mordack550

1
ord mordack550, මම බ්ලූහර්න් සමඟ එකඟ වෙමි. ඔහු හරි. SQL හි වගුවක් තිබේදැයි සොයා බැලීම සඳහා ගූගල් හි ඉහළම පහර මෙයයි. ඔහුගේ අභිප්රායන් යහපත් වන අතර ඔහුගේ තොරතුරු ප්රයෝජනවත් වේ. +1
මාර්ක්

SQL වැනි පොදු ප්‍රමිතීන් සහ රටාවන් වැලඳ ගැනීමට / දිගු කිරීමට / නිවා දැමීමට උත්සාහ කිරීමේ පුරුද්දක් මයික්‍රොසොෆ්ට් සතුව තිබීම අවාසනාවකි. ඔවුන් සැබවින්ම SQL සේවාදායකයක් ක්‍රියාත්මක කිරීම සඳහා නිසි නමක් ලබා දී ඇතැයි මම ප්‍රාර්ථනා කරමි, එවිට මිනිසුන්ට ඔවුන්ගේ නිෂ්පාදනයට විශේෂිත යොමු කිරීම් නිසැකවම හඳුනාගත හැකිය.
psaxton


2

ඔබට මෙය භාවිතා කළ හැකිය:

     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


1

- - වගුවක් තිබේදැයි පරීක්ෂා කිරීමට ක්‍රියා පටිපාටියක් සාදන්න


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);

1
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

1

මම මෙහි උදාහරණයක් ලෙස දර්ශනයක් නිර්මාණය කරමි .

ALTER / CREATE විධානයන් BEGIN / END බ්ලොක් තුළ තිබිය නොහැකි බැවිනි. නිර්මාණයක් කිරීමට පෙර ඔබ පැවැත්ම පරීක්ෂා කර එය අතහැර දැමිය යුතුය

IF Object_ID('TestView') IS NOT NULL
DROP VIEW TestView

GO

CREATE VIEW TestView
   as
   . . .

GO

අවසර නැතිවීම ගැන ඔබ කනස්සල්ලට පත්ව සිටී නම්, ඔබට ග්‍රාන්ට් ප්‍රකාශයන් ස්ක්‍රිප්ට් කර අවසානයේ ඒවා නැවත ක්‍රියාත්මක කළ හැකිය.

ඔබට නිර්මාණය / වෙනස් කිරීම නූලකට ඔතා EXEC එකක් කළ හැකිය - එය විශාල දර්ශන සඳහා කැත විය හැකිය

DECLARE @SQL as varchar(4000)

-- set to body of view
SET @SQL = 'SELECT X, Y, Z FROM TABLE' 

IF Object_ID('TestView') IS NULL
    SET @SQL = 'CREATE VIEW TestView AS ' + @SQL
ELSE    
    SET @SQL = 'ALTER VIEW TestView AS ' + @SQL

0

යමෙකු ලින්ක් සිට වර්ග (හෝ විශේෂයෙන් ලින්ක්පෑඩ්) දක්වා මෙය කිරීමට උත්සාහ කරන්නේ නම් පද්ධති වගු සහ දර්ශන ඇතුළත් කිරීමට විකල්පය සක්‍රිය කර මෙම කේතය කරන්න:

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


0

මෙය 'අවසාන' සාකච්ඡාව නම්, ලැරී ලෙනාඩ්ගේ ස්ක්‍රිප්ටයට දුරස්ථ සේවාදායකයක් විමසීමට හැකි අතර සේවාදායකයන් සම්බන්ධ වී තිබේ නම් එය සැලකිල්ලට ගත යුතුය.

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'

සමහර විට මෙය ලෙනාඩ්ස්ගේ පිළිතුරට අදහස් දැක්වීමක් ලෙස හෝ සංස්කරණයක් ලෙස එකතු කිරීම වඩාත් සුදුසු ද?
ඊවිට්

0

INFORMATIONAL_SCHEME සහ OBJECT_ID වෙතින් තෝරාගැනීමේදී මට යම් ගැටළු තිබේ. එය ODBC ධාවකයේ හෝ වෙනත් දෙයක් දැයි මම නොදනිමි .. SQL කළමනාකරණ චිත්‍රාගාරයේ විමසීම් දෙකම හරි ය.

මෙන්න විසඳුම:

SELECT COUNT(*) FROM <yourTableNameHere>

එබැවින්, විමසුම අසමත් වුවහොත්, බොහෝ විට, දත්ත සමුදායේ එවැනි වගුවක් නොමැත (හෝ ඔබට එයට ප්‍රවේශ අවසර නොමැත).

ODBC ධාවක සමඟ ගනුදෙනු කරන SQL විධායකයා විසින් ආපසු ලබා දුන් අගය (මගේ නඩුවේ පූර්ණ සංඛ්‍යා) සංසන්දනය කිරීමෙන් චෙක්පත සිදු කෙරේ.

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}

කුමන ප්‍රතිදානය සමඟ අසමත් වේද?
wscourge

cwscourge, SQL විමසුම අසමත් හෝ ඒ හා සමාන දෙයක්. මම ක්‍රියාත්මක කිරීමේ ශ්‍රිතයෙන් ප්‍රතිලාභ අගය පරීක්ෂා කරමි.
මයිකල් ක්වාඩ්

එය ඔබේ පිළිතුරට එක් කරන්න
wscourge

0

දත්ත සමුදායන් හරහා වගුව තිබේදැයි පරීක්ෂා කිරීමට තවත් එක් විකල්පයක් ඇත

IF EXISTS(SELECT 1 FROM [change-to-your-database].SYS.TABLES WHERE NAME = 'change-to-your-table-name')
BEGIN
    -- do whatever you want
END

-1

දත්ත සමුදාය තුළ වගුව තිබේදැයි පරීක්ෂා කිරීමට මෙම විමසුම ක්‍රියාත්මක කරන්න:

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';

-6

එක් දත්ත ගබඩාවක ඔබට t1 වගුවක් ඇති බව සලකා බලන්න. ඔබට වෙනත් දත්ත සමුදායන් මත ස්ක්‍රිප්ට් ධාවනය කිරීමට අවශ්‍යය - t1 පවතී නම් t1 සාදන්න වෙන කිසිවක් නොකරන්න. මෙම විවෘත දෘශ්‍ය චිත්‍රාගාරය කිරීමට සහ පහත සඳහන් දෑ කරන්න:

T1 මත රයිට් ක්ලික් කරන්න, ඉන්පසු ස්ක්‍රිප්ට් වගුව ලෙස, පසුව DROP සහ Create To, ඉන්පසු නව විමසුම් සංස්කාරකය

ඔබ අපේක්ෂිත විමසුම සොයා ගනු ඇත. නමුත් එම ස්ක්‍රිප්ට් එක ක්‍රියාත්මක කිරීමට පෙර විමසුමේ බිංදු ප්‍රකාශය අදහස් දැක්වීමට අමතක නොකරන්න, මන්ද යත් දැනටමත් එකක් තිබේ නම් නව එකක් නිර්මාණය කිරීමට ඔබට අවශ්‍ය නැත.

ස්තූතියි


එස්එස්එම්එස් 2012 හි එය කවදා හෝ සිදු කර ඇත්නම් එය තවදුරටත් පවතින්නේ නම් එය තවදුරටත් සිදු නොකරයි (පෙර අනුවාදයන් ඉහත පිටපත ජනනය කළේ කෙසේදැයි මට මතක නැත). සමහර විට ඔබ වෙනත් ඩීබී මෙවලම් වගු වස්තු ස්ක්‍රිප්ට් කරන ආකාරය වැරදියට තේරුම් ගෙන තිබේද?
අයිවාලෝ ස්ලාවොව්

ඔබ ඉල්ලන්නේ නම් SSMS විසින් තිබේ නම් පරීක්ෂා කිරීම සිදු කරයි. මෙවලම්> විකල්ප> SQL සේවාදායක වස්තු ගවේෂකය> ස්ක්‍රිප්ටින්> "වස්තු ස්ක්‍රිප්ටින් විකල්ප": "වස්තු පැවැත්ම පරීක්ෂා කරන්න" = සත්‍ය
සීන් ඇලෙක්සැන්ඩර්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.