2010-09-21 15 views
16

मैं कुछ पुनः काम कर रहा हूं और कॉलम खोजने के लिए कुछ सौ SQL सर्वर डेटाबेस तालिकाओं को खोद रहा हूं।नाम से कॉलम के लिए एसक्यूएल सर्वर खोज

क्या डेटाबेस में कॉलम आसानी से खोजने का कोई तरीका है और केवल उस तालिका का नाम लौटाएं जो कॉलम से संबंधित है?

मैं this पाया है, लेकिन वह भी रिटर्न उस में उस स्तंभ नाम के साथ संग्रहित प्रक्रियाओं ...

उत्तर

34
SELECT OBJECT_NAME(object_id) FROM sys.columns WHERE name = 'foo' 

यह हालांकि दृश्य भी शामिल है, लेकिन आगे फ़िल्टर किया जा सकता। हालांकि यह उपयोगी हो सकता है।

अधिक आम तौर पर ...

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'foo' 

sys.columns

+0

यह बहुत अच्छा काम करता है, जब सिस्टम मुझे अनुमति देता है तो मैं जवाब स्वीकार करूंगा ... – EJC

2
select c.name as ColumnName, o.name as TableName 
from sys.columns c 
inner join sys.objects o on c.object_id = o.object_id 
where c.name = 'MyColumnName' 
0
select table_name from information_schema.columns 
where column_name = '<your column name here>' 

INFORMATION_SCHEMA दृश्यों का उपयोग करना प्रणाली डेटाबेस SQL ​​सर्वर के कार्यान्वयन के बीच परिवर्तन के अधीन हैं में सिस्टम विवरण के रूप में 'और अधिक सही' है।

+0

कॉलम नाम तालिका में अद्वितीय होने पर आपके पास DISTINCT क्यों होगा? – gbn

+0

मैं अजीब छाप के तहत था कि तालिका का नाम कई बार दिखाया जा सकता है (विशेष रूप से यदि आपके पास समान स्कीमा वाले कई डेटाबेस हैं, और अपनी क्वेरी को किसी विशिष्ट स्कीमा या डेटाबेस पर सीमित न करें)। हिंडसाइट में अधिकांश संदर्भों में शायद अलग बेकार है। – Kilanash

6

1) पूर्ण स्तंभ नाम प्राप्त करने के लिए
2) (स्कीमा सहित)
3) ऑब्जेक्ट प्रकार (तालिका/देखें)
4) डेटा प्रकार (अच्छा प्रारूप वस्तु का नाम: varchar (6) या संख्यात्मक (5,2), आदि)
5) अशक्त/नहीं अशक्त
6) पहचान के बारे में जानकारी, बाधा की जाँच करें, और डिफ़ॉल्ट जानकारी

इस प्रयास करें:

DECLARE @Search varchar(200) 
SET @Search='YourColumnName' --can be a partial or a complete name 

SELECT 
    s.name as ColumnName 
     ,sh.name+'.'+o.name AS ObjectName 
     ,o.type_desc AS ObjectType 
     ,CASE 
      WHEN t.name IN ('char','varchar') THEN t.name+'('+CASE WHEN s.max_length<0 then 'MAX' ELSE CONVERT(varchar(10),s.max_length) END+')' 
      WHEN t.name IN ('nvarchar','nchar') THEN t.name+'('+CASE WHEN s.max_length<0 then 'MAX' ELSE CONVERT(varchar(10),s.max_length/2) END+')' 
      WHEN t.name IN ('numeric') THEN t.name+'('+CONVERT(varchar(10),s.precision)+','+CONVERT(varchar(10),s.scale)+')' 
      ELSE t.name 
     END AS DataType 

     ,CASE 
      WHEN s.is_nullable=1 THEN 'NULL' 
      ELSE 'NOT NULL' 
     END AS Nullable 
     ,CASE 
      WHEN ic.column_id IS NULL THEN '' 
      ELSE ' identity('+ISNULL(CONVERT(varchar(10),ic.seed_value),'')+','+ISNULL(CONVERT(varchar(10),ic.increment_value),'')+')='+ISNULL(CONVERT(varchar(10),ic.last_value),'null') 
     END 
     +CASE 
      WHEN sc.column_id IS NULL THEN '' 
      ELSE ' computed('+ISNULL(sc.definition,'')+')' 
     END 
     +CASE 
      WHEN cc.object_id IS NULL THEN '' 
      ELSE ' check('+ISNULL(cc.definition,'')+')' 
     END 
      AS MiscInfo 
    FROM sys.columns       s 
     INNER JOIN sys.types     t ON s.system_type_id=t.system_type_id and t.is_user_defined=0 
     INNER JOIN sys.objects     o ON s.object_id=o.object_id 
     INNER JOIN sys.schemas    sh on o.schema_id=sh.schema_id 
     LEFT OUTER JOIN sys.identity_columns ic ON s.object_id=ic.object_id AND s.column_id=ic.column_id 
     LEFT OUTER JOIN sys.computed_columns sc ON s.object_id=sc.object_id AND s.column_id=sc.column_id 
     LEFT OUTER JOIN sys.check_constraints cc ON s.object_id=cc.parent_object_id AND s.column_id=cc.parent_column_id 
    WHERE s.name LIKE '%'[email protected]+'%' 
संबंधित मुद्दे