तालिका परिभाषा दिखाने के लिए T-SQL क्वेरी?


105

एक क्वेरी क्या है जो मुझे SQL सर्वर तालिका के लिए अनुक्रमित और कुंजियों सहित पूर्ण परिभाषा दिखाएगा? मैं एक शुद्ध क्वेरी चाहता हूं - और जानता हूं कि एसक्यूएल स्टूडियो मुझे यह दे सकता है, लेकिन मैं अक्सर "जंगली" कंप्यूटरों पर हूं, जिसमें केवल सबसे अधिक नंगे हड्डियों वाले ऐप हैं और मुझे स्टूडियो स्थापित करने का कोई अधिकार नहीं है। लेकिन SQLCMD हमेशा एक विकल्प होता है।

अद्यतन: मैंने sp_help की कोशिश की है, लेकिन सिर्फ एक रिकॉर्ड है जो नाम, स्वामी, प्रकार और बनाया गया_टाइम दिखाता है। क्या कुछ और है जो मुझे sp_help के साथ याद आ रहा है?

यहाँ मैं कहता हूँ:

sp_help हवाई अड्डे

ध्यान दें कि मैं वास्तव में डीडीएल चाहता हूं जो तालिका को परिभाषित करता है।


1
आप जिसके साथ लापता हैं sp_helpवह कई परिणाम सेट देता है। आप पहले परिणाम सेट द्वारा दिए गए कॉलम का वर्णन कर रहे हैं।
जो स्टेफेनेली

1
अच्छा प्रश्न। MySQL से आ रहा है, समाधान बहुत कम हो जाते हैं, क्योंकि सभी एक ही स्थान पर कॉलम, इंडेक्स, विदेशी कुंजी, बाधा नाम नहीं देख सकते हैं। यह तब गंभीर होता है जब आपके पास अपने ऑब्जेक्ट एक्सप्लोरर में कई डेटाबेस / टेबल होते हैं। आशा है कि Microsoft इसे भविष्य में संबोधित करेगा। मैंने किसी भी उत्पादकता उपकरण का उपयोग नहीं किया है लेकिन SSMSBoost आशाजनक लगता है।
पीटर n

1
@Microsoft कृपया MySQL की तरह DESC TABLE जोड़ें। आसान। सरल। किया हुआ।
पीट एल्विन

जवाबों:


127

डीडीएल को वापस करने का कोई आसान तरीका नहीं है। हालाँकि आप जानकारी स्कीमा दृश्य और सिस्टम दृश्य से अधिकांश विवरण प्राप्त कर सकते हैं ।

SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
       , IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Customers'

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE
WHERE TABLE_NAME = 'Customers'

SELECT name, type_desc, is_unique, is_primary_key
FROM sys.indexes
WHERE [object_id] = OBJECT_ID('dbo.Customers')

1
धन्यवाद। मुझे संदेह होने लगा था कि इसे प्राप्त करने का एकमात्र तरीका कई अलग-अलग तालिकाओं में क्वेरी करना होगा, और यह है कि SQL स्टूडियो क्या करता है जब आप इसे "DDL उत्पन्न" करने के लिए कहते हैं। Iaa लेकिन आश्चर्य है कि कोई सामान्य एसपी नहीं है जो इसे आपके लिए करेगा।
डैनियल विलियम्स

6
यह है। यदि आप केवल कॉलम की जानकारी चाहते हैं, तो आप sp_columnsमेरे उत्तर में बताए अनुसार निष्पादित कर सकते हैं । यदि आप FKs रन के बारे में जानकारी चाहते हैं sp_fkeys। यदि आप अनुक्रमित जानना चाहते हैं, तो निष्पादित करें sp_statistics

69

क्या आपने sp_help आज़माया है?

sp_help 'TableName'

1
यह संरचना, बाधाओं, गर्भनिरोधक प्रकार आदि को दर्शाता है। बस एक बात ध्यान दें: आपको संपूर्ण नाम लिखना होगा। Schema.TableName। अन्यथा, यह पूरी तरह से समस्या को हल करता है और तालिका के बारे में सभी जानकारी देता है।
FrenkyB

1
पूर्ण पथ के साथ, तालिका के डीडीएल को भी वापस नहीं करता है।
कोवगेक

25

यात्रा http://www.stormrage.com/SQLStuff/sp_GetDDL_Latest.txt

आपको sp_getddlSQL सर्वर के लिए प्रक्रिया का कोड मिलेगा । प्रक्रिया का उद्देश्य स्क्रिप्ट किसी भी तालिका, अस्थायी तालिका या वस्तु है।

उपयोग:

exec sp_GetDDL GMACT

या

exec sp_GetDDL 'bob.example'

या

exec sp_GetDDL '[schemaname].[tablename]'

या

exec sp_GetDDL #temp

मैंने इसे SQL सर्वर 2012 पर परीक्षण किया, और यह एक उत्कृष्ट काम करता है।

मैं प्रक्रिया का लेखक नहीं हूं। आपके द्वारा इसे सुधारने के लिए कोई भी सुधार लोवेल इज़गुइरे (लिपियों @stormrage.com) को भेजें।


इस स्क्रिप्ट और साझा करने के लिए धन्यवाद! मैं पूछूंगा कि क्या आपके पास कोई पोस्ट है जहां हम इस स्क्रिप्ट के बारे में चर्चा कर सकते हैं?
बेलश

अति उत्कृष्ट! MSFT के पास प्रबंधन स्टूडियो के अंदर ऐसा कार्य होना चाहिए
Tertium

19

सबसे आसान और तेज तरीका मैं सोच सकता हूं कि sp_help का उपयोग करना होगा

sp_help 'TableName'


18

CREATE TABLEकिसी भी टेबल के लिए स्क्रिप्ट (बाधाओं के साथ) पाने वाली इस छोटी सी विंडोज कमांड लाइन ऐप का उपयोग करें । मैंने इसे C # में लिखा है। बस इसे संकलित करें और इसे मेमोरी स्टिक पर ले जाएं। शायद कोई इसे Powershell पर पोर्ट कर सकता है।

using System;
using System.Linq;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
namespace ViewSource
{
    public class ViewSource
    {
        public static void Main(string[] args)
        {
            if (args.Length != 6)
            {
                Console.Error.WriteLine("Syntax: ViewSource.exe <server>" +
                     " <user> <password> <database> <schema> <table>");
            }

            Script(args[0], args[1], args[2], args[3], args[4], args[5]);
        }
        private static void Script(string server, string user,
            string password, string database, string schema, string table)
        {
            new Server(new ServerConnection(server, user, password))
                .Databases[database]
                .Tables[table, schema]
                .Script(new ScriptingOptions { SchemaQualify = true,
                                               DriAll = true })
                .Cast<string>()
                .Select(s => s + "\n" + "GO")
                .ToList()
                .ForEach(Console.WriteLine);
        }
    }
}

2
यह T-SQL नहीं है
ivan_pozdeev

मुझे आश्चर्य है कि अगर आप SQL Profiler का उपयोग करते हैं तो यह कमांड को पकड़ने के लिए क्या होगा। : ->
पॉल स्मिथ

बस यह जोड़ना चाहता था कि यह किसी भी सीडीसी टेबल को स्क्रिप्ट नहीं करेगा :( जैसा कि वर्तमान में एसएमओ में समर्थित नहीं है।
एच। अब्राहम शावेज

मैंने PowerShell पोर्ट के साथ एक उत्तर जोड़ा। आशा है कि यह किसी की मदद करता है।
आर। हॉर्बर


6

यह स्तंभ, डेटाटिप्स और तालिका पर परिभाषित अनुक्रमित लौटाएगा:

--List all tables in DB
select * from sysobjects where xtype = 'U'

--Table Definition
sp_help TableName

यह तालिका पर परिभाषित ट्रिगर लौटाएगा:

--Triggers in SQL Table
select * from sys.triggers where parent_id = object_id(N'SQLTableName') 

6

SQL 2012 के बाद से आप निम्न कथन चला सकते हैं:

Exec sp_describe_first_result_set @tsql= N'Select * from <yourtable>'

यदि आप एक जटिल चयन स्टेटमेंट (ज्वाइन, सबसेलेक्ट्स इत्यादि) दर्ज करते हैं, तो यह आपको परिणाम सेट की परिभाषा देगा। यह बहुत आसान है, यदि आपको एक नई तालिका (या अस्थायी तालिका) बनाने की आवश्यकता है और आप मैन्युअल रूप से प्रत्येक एकल फ़ील्ड परिभाषा की जांच नहीं करना चाहते हैं।

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-describe-first-result-set-transact-sql


4

बस तालिका नाम टाइप करें और इसे चुनें और ATL + F1 दबाएं

अपनी तालिका का नाम कहें Customerफिर एक नई क्वेरी विंडो खोलें , टाइप करें और तालिका नाम चुनें और ALT + F1 दबाएं

यह तालिका की पूरी परिभाषा दिखाएगा।


एक अच्छा)) लेकिन मेरे लिए, यह पूरे डेटाबेस के लिए डेटा दिखाता है। मैंने इसमें केवल तालिका नाम के साथ नई क्वेरी विंडो की कोशिश की है और यह काम नहीं करता है - यह हमेशा सब कुछ दिखाता है। अन्यथा, अच्छा टिप :)
FrenkyB

मैंने इसका उपयोग 2008 और 2012 के साथ किया था, पुराने संस्करणों के बारे में निश्चित नहीं है, और यह हमेशा मेरे लिए काम करता है, बस तालिका का नाम और ALT + F1, यदि स्कीमा का उपयोग करना चाहते हैं तो 'स्कीमा.टेबल'।
अली आद्रवी

यह sp_help 'schema.tablename' का शॉर्टकट है
अली एड्रावी

2
तब काम किया जब मैंने तालिका नाम चुना था। अगर क्वेरी विंडो में कुछ और होता तो पूरा डेटाबेस दिखाया जाता।
डीबी टेक

3

LINQPad का उपयोग करने वालों के लिए @Anthony Faull के उत्तर की विविधता:

new Server(new ServerConnection(this.Connection.DataSource))
    .Databases[this.Connection.Database]
    .Tables["<table>", "dbo"]
    ?.Script(new ScriptingOptions {
        SchemaQualify = true,
        DriAll = true,
    })

आपको 2 विधानसभाओं को संदर्भित करने की आवश्यकता होगी:

  • Microsoft.SqlServer.ConnectionInfo.dll
  • Microsoft.SqlServer.Smo.dll

और एंथनी के स्निपेट में वर्णित नामस्थान संदर्भ जोड़ें।


3

मुझे पता है कि यह एक पुराना सवाल है, लेकिन वास्तव में मैं क्या देख रहा था। क्योंकि मैं कुछ तालिकाओं को स्क्रिप्ट करना चाहता हूं, इसलिए मैं एंथनी फाउल से पॉवरशेल के सी # कोड को फिर से लिखवाता हूं।

यह एक एकीकृत सुरक्षा का उपयोग करता है:

Import-Module sqlps

$serverInstance = "<server>"
$database = "<database>"
$table = "<table>"
$schema = "<schema>"

$options = New-Object -TypeName Microsoft.SqlServer.Management.Smo.ScriptingOptions
$options.DriAll = $true
$options.SchemaQualify = $true

$connection = New-Object -TypeName Microsoft.SqlServer.Management.Common.ServerConnection `
    -ArgumentList $serverInstance
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server `
    -ArgumentList $connection

$server.Databases.Item($database).Tables.Item($table, $schema).Script($options) `
    | ForEach-Object -Process { $_ + "`nGO"}

और यहां उपयोगकर्ता नाम और पासवर्ड:

Import-Module sqlps

$serverInstance = "<server>"
$user = "<user>"
$password = "<pasword>"
$database = "<database>"
$table = "<table>"
$schema = "<schema>"

$options = New-Object -TypeName Microsoft.SqlServer.Management.Smo.ScriptingOptions
$options.DriAll = $true
$options.SchemaQualify = $true

$connection = New-Object -TypeName Microsoft.SqlServer.Management.Common.ServerConnection `
    -ArgumentList $serverInstance
$connection.LoginSecure = $false
$connection.Login = $user
$connection.Password = $password
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server `
    -ArgumentList $connection

$server.Databases.Item($database).Tables.Item($table, $schema).Script($options) `
    | ForEach-Object -Process { $_ + "`nGO"}


2

बैरी के जवाब के अतिरिक्त। Sp_help का उपयोग किसी विशेष डेटाबेस में सभी वस्तुओं को पुन: व्यवस्थित करने के लिए भी किया जा सकता है। आपके पास अपने शस्त्रागार के लिए sp_helptext भी है, जो प्रोग्राम किए गए तत्वों को संग्रहीत प्रक्रियाओं की तरह स्क्रिप्ट करता है।


2

दूसरा तरीका sp_columns प्रक्रिया को निष्पादित करना है।

EXEC sys.sp_columns @TABLE_NAME = 'YourTableName'


-5

"ध्यान दें कि मैं वास्तव में डीडीएल चाहता हूं जो तालिका को परिभाषित करता है।"

pg_dump का उपयोग करें:

pg_dump -s -t tablename dbname

यह आपको सादा एसक्यूएल में डेटाबेस में -sएक निश्चित तालिका ( -tटैबलेन) का तालिका परिभाषा ( केवल स्कीमा, नो डेटा) देता है "dbname"। इसके अतिरिक्त आप अनुक्रम, प्राथमिक कुंजी और बाधा जानकारी प्राप्त करेंगे। अपनी आवश्यकताओं के अनुसार जाँच और संपादन के बाद आप जो आउटपुट कर सकते हैं, उसे फिर से (उसी या किसी अन्य) में फीड किया जा सकता है।

pg_dump -s -t tablename dbname1  > /tmp/foo.sql
psql -e dbname2 < /tmp/foo.sql

यह UNIX / Linux के लिए है, लेकिन मुझे यकीन है, कि एक pg_dump विंडोज के लिए भी मौजूद है।


1
नहीं! यह Microsoft SQL सर्वर के लिए पोस्टग्रेज नहीं है।
मार्क

3
प्रश्न में निर्दिष्ट पूरे प्लेटफ़ॉर्म और डेटाबेस इंजन को अनदेखा करना। अच्छा लगा।
जेरेमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.