डेटाबेस में प्रत्येक में तालिकाओं, और फ़ील्ड्स की सूची प्राप्त करना


84

मैं एक मूल ORM बना रहा हूं (विशुद्ध रूप से मनोरंजन के लिए), और सोच रहा था, क्या डेटाबेस में तालिकाओं की सूची और हर तालिका के लिए फ़ील्ड वापस करने का कोई तरीका है?

इसका उपयोग करते हुए, मैं परिणाम सेट (C # में) के माध्यम से लूप करने में सक्षम होना चाहता हूं और फिर परिणाम सेट में प्रत्येक तालिका के लिए कहता हूं, ऐसा करें (उदाहरण के लिए एक वर्ग बनाने के लिए प्रतिबिंब का उपयोग करें जो xyz करेगा या जिसमें शामिल होगा)।

इसके अलावा, SQL सर्वर के लिए कुछ अच्छे ऑनलाइन ब्लॉग क्या हैं? मुझे पता है कि यह प्रश्न वास्तव में Sql सर्वर में सिस्टम SPs और डेटाबेस का उपयोग करने के बारे में है, और मैं सामान्य प्रश्नों के साथ ठीक हूं, इसलिए मुझे कुछ ब्लॉगों में दिलचस्पी है जो इस प्रकार की कार्यक्षमता को कवर करते हैं।

धन्यवाद


पुन; SQL सर्वर ब्लॉग सूची - मेरे ब्लॉग में इस प्रविष्टि पर एक नज़र डालें: dbalink.wordpress.com/2009/01/07/…
MarlonRibunal

संबंधित प्रश्न देखें: stackoverflow.com/questions/175415/…
Ray

1
धन्यवाद। कार्य C # के साथ किया जा सकता है।
गुरदीप

जवाबों:


172

क्या यह वही है आप जिसकी तलाश में हैं:

OBJECT CATALOG VIEWS का उपयोग करना

 SELECT T.name AS Table_Name ,
       C.name AS Column_Name ,
       P.name AS Data_Type ,
       P.max_length AS Size ,
       CAST(P.precision AS VARCHAR) + '/' + CAST(P.scale AS VARCHAR) AS Precision_Scale
FROM   sys.objects AS T
       JOIN sys.columns AS C ON T.object_id = C.object_id
       JOIN sys.types AS P ON C.system_type_id = P.system_type_id
WHERE  T.type_desc = 'USER_TABLE';

सूचना स्कीम का उपयोग करना

  SELECT TABLE_SCHEMA ,
       TABLE_NAME ,
       COLUMN_NAME ,
       ORDINAL_POSITION ,
       COLUMN_DEFAULT ,
       DATA_TYPE ,
       CHARACTER_MAXIMUM_LENGTH ,
       NUMERIC_PRECISION ,
       NUMERIC_PRECISION_RADIX ,
       NUMERIC_SCALE ,
       DATETIME_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS;

संदर्भ: मेरा ब्लॉग - http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/


7
पहली क्वेरी हमेशा चार्लोट के लिए अधिकतम = 8000 रिटर्न देती है, जो गलत है। दूसरी क्वेरी सही है और अधिक विस्तृत है
smirkingman

1
दोनों प्रश्न पंक्ति की अलग-अलग
संख्याएँ लौटाते हैं

INFORMATION_SCHEMAदृष्टिकोण का एक फायदा यह है कि यह विभिन्न डेटाबेस में काफी पोर्टेबल है।
j_random_hacker

कि एक टाइपो है? मैं उपयोग करता हूं C.max_length AS Size ,- अन्यथा आप केवल @smirkingman के रूप में अधिकतम गति = 8000 के साथ समाप्त होंगे।
mbx

मुझे लगता है कि पहली क्वेरी स्कीमा को सूचीबद्ध नहीं करती है और कई पंक्तियों (डुप्लिकेट) को भी लौटाती है और दूसरी क्वेरी पंक्तियों की सही संख्या लौटा रही है। तो 2 क्वेरी का उपयोग करने के लिए एक है।
गैरी बैरेट

36

तालिकाएँ ::

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

कॉलम ::

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 

या

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='your_table_name'

8
INFORMATION_SCHEMA के बारे में अच्छी बात यह है कि यह एक आईएसओ बात है, न कि केवल एक sql सर्वर चीज। समान कोड सभी आज्ञाकारी डेटाबेसों के लिए काम करेगा
cindi

यह बहुत उपयोगी है ... लेकिन उपरोक्त अभिव्यक्ति में डेटाबेस का नाम कैसे शामिल किया जाए? अग्रिम धन्यवाद ..
अमित वर्मा

@AmitVerma USE <your DB name>; SELECT * FROM INFORMATION_SCHEMA.COLUMNS (MS SQL सिंटैक्स कम से कम)
क्रिस ओ

12

डेटाबेस में सभी तालिकाओं और क्षेत्रों की सूची प्राप्त करें:

Select *
From INFORMATION_SCHEMA.COLUMNS
Where TABLE_CATALOG Like 'DatabaseName'

तालिका के सभी क्षेत्रों की सूची प्राप्त करें:

Select *
From INFORMATION_SCHEMA.COLUMNS
Where TABLE_CATALOG Like 'DatabaseName' And TABLE_NAME Like 'TableName' 

INFORMATION_SCHEMAदृष्टिकोण का एक फायदा यह है कि यह विभिन्न डेटाबेस में काफी पोर्टेबल है।
j_random_hacker


7

मैंने पाया कि कुछ समाधानों का परीक्षण किया

Select *
From INFORMATION_SCHEMA.COLUMNS

आपको अपने CURRENT / डिफ़ॉल्ट डेटाबेस के लिए कॉलम जानकारी देता है।

Select *
From <DBNAME>.INFORMATION_SCHEMA.COLUMNS

, बिना <और>, आपको डेटाबेस DBNAME के ​​लिए कॉलम जानकारी देता है।


3

आपके अन्य इनबिल्ट दोस्त यहाँ SP_HELP सिस्टम स्प्रो है।

नमूना उपयोग ::

sp_help <MyTableName>

यह एक बहुत अधिक जानकारी देता है जितना आपको वास्तव में आवश्यकता होगी, लेकिन आपकी संभावित आवश्यकताओं में से कम से कम 90% को पूरा किया जाएगा।


1

बस इसे वहाँ से बाहर फेंकना - अब एक शब्द या Google डॉक में कॉपी / पेस्ट करना आसान है:

PRINT '<html><body>'
SET NOCOUNT ON
DECLARE @tableName VARCHAR(30)
DECLARE tableCursor CURSOR LOCAL FAST_FORWARD FOR
    SELECT T.name AS TableName 
      FROM sys.objects AS T
     WHERE T.type_desc = 'USER_TABLE'
     ORDER BY T.name
OPEN tableCursor
FETCH NEXT FROM tableCursor INTO @tableName
WHILE @@FETCH_STATUS = 0 BEGIN
    PRINT '<h2>' + @tableName + '</h2>'
    PRINT '<pre>'
    SELECT LEFT(C.name, 30) AS ColumnName,
           LEFT(ISC.DATA_TYPE, 10) AS DataType,
           C.max_length AS Size,
           CAST(P.precision AS VARCHAR(4)) + '/' + CAST(P.scale AS VARCHAR(4)) AS PrecScale,
           CASE WHEN C.is_nullable = 1 THEN 'Null' ELSE 'No Null' END AS [Nullable],
           LEFT(ISNULL(ISC.COLUMN_DEFAULT, ' '), 5)  AS [Default],
           CASE WHEN C.is_identity = 1 THEN 'Identity' ELSE '' END AS [Identity]
    FROM   sys.objects AS T
           JOIN sys.columns AS C ON T.object_id = C.object_id
           JOIN sys.types AS P ON C.system_type_id = P.system_type_id
           JOIN INFORMATION_SCHEMA.COLUMNS AS ISC ON T.name = ISC.TABLE_NAME AND C.name = ISC.COLUMN_NAME
    WHERE  T.type_desc = 'USER_TABLE'
      AND  T.name = @tableName
    ORDER BY T.name, ISC.ORDINAL_POSITION
    PRINT '</pre>'
    FETCH NEXT FROM tableCursor INTO @tableName

END

CLOSE tableCursor
DEALLOCATE tableCursor
SET NOCOUNT OFF
PRINT '</body></html>'

1

MYSQL के लिए:

Select *
From INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = "<DatabaseName>"

TABLE_SCHEMAडेटाबेस का नाम नहीं है, इसका स्कीमा नाम (यानी dbo) है। TABLE_CATALOGडेटाबेस का नाम है।
डीडीफी

TABLE_SCHEMA: स्कीमा (डेटाबेस) का नाम जिससे तालिका संबंधित है। TABLE_CATALOG: उस सूची का नाम, जिसमें तालिका है।
ज्योतिरंजन

mysql में mssql नहीं। मुझे गलत मत समझो, आपका जवाब गलत नहीं था। यह सही है, सिर्फ mssql के लिए नहीं। मेरा मानना ​​है कि वे दोनों में स्कीमा का अलग-अलग व्यवहार करते हैं।
डीडीफी

0

यह आपको सभी उपयोगकर्ता द्वारा बनाई गई तालिकाएँ मिलेंगी:

select * from sysobjects where xtype='U'

सर्दी पाने के लिए:

Select * from Information_Schema.Columns Where Table_Name = 'Insert Table Name Here'

इसके अलावा, मुझे लगता है कि http://www.sqlservercentral.com/ एक अच्छा डीबी संसाधन है।


0

यह डेटाबेस का नाम, टेबल का नाम, कॉलम का नाम और डेटाबेस पैरामीटर द्वारा निर्दिष्ट कॉलम का डेटाटाइप लौटाएगा:

declare @database nvarchar(25)
set @database = ''

SELECT cu.table_catalog,cu.VIEW_SCHEMA, cu.VIEW_NAME, cu.TABLE_NAME,   
cu.COLUMN_NAME,c.DATA_TYPE,c.character_maximum_length
from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE as cu
JOIN INFORMATION_SCHEMA.COLUMNS as c
on cu.TABLE_SCHEMA = c.TABLE_SCHEMA and c.TABLE_CATALOG = 
cu.TABLE_CATALOG
and c.TABLE_NAME = cu.TABLE_NAME
and c.COLUMN_NAME = cu.COLUMN_NAME
where cu.TABLE_CATALOG = @database
order by cu.view_name,c.COLUMN_NAME

सभी दृश्यों के लिए , यह तालिका का नाम, स्तंभ का नाम, डेटा प्रकार और दृश्य द्वारा लौटाए गए प्रत्येक स्तंभ की लंबाई को सूचीबद्ध करता है। इस सवाल का जवाब नहीं है, लेकिन यह एक साफ क्वेरी है।
बेन

0

मैंने SQL डेवलपर का उपयोग करके किसी विशेष DB के टेबल्स और कॉलम का विवरण प्राप्त करने का एक आसान तरीका पाया।

Select *FROM USER_TAB_COLUMNS

0

SELECT * FROM INFORMATION_SCHEMA.COLUMNS सबको भूल जाओ

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNSसभी तालिका नाम प्राप्त करने के लिए। Sqlserver पर इसे आजमाएं,


-1

Microsoft SQL सर्वर में आप इसका उपयोग कर सकते हैं:

declare @sql2 nvarchar(2000)
        set @sql2  ='
use ?
if (  db_name(db_id()) not in (''master'',''tempdb'',''model'',''msdb'',''SSISDB'')  )
begin   

select
    db_name() as db,
    SS.name as schemaname,
    SO.name tablename,
    SC.name columnname,
    ST.name type,
    case when ST.name in (''nvarchar'', ''nchar'')
        then convert(varchar(10), ( SC.max_length / 2 ))
        when ST.name in (''char'', ''varchar'')
        then convert(varchar(10), SC.max_length)
        else null
    end as length,
    case when SC.is_nullable = 0 then ''No'' when SC.is_nullable = 1 then ''Yes'' else null end as nullable,
    isnull(SC.column_id,0) as col_number
from sys.objects                  SO
join sys.schemas                  SS
    on SS.schema_id = SO.schema_id
join sys.columns             SC
on SO.object_id     = SC.object_id
left join sys.types               ST
    on SC.user_type_id = ST.user_type_id and SC.system_type_id = ST.system_type_id
    where SO.is_ms_shipped = 0 
end
'

exec sp_msforeachdb @command1 = @sql2

यह आपको सभी उपयोगकर्ता-निर्धारित डेटाबेस से सभी टेबल और कॉलम (और उनकी परिभाषा) दिखाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.