2008-10-22 3 views
6

मैं निम्नलिखित संग्रहीत प्रक्रिया को क्रियान्वित करते हुए एक मेज के बाइट्स में पंक्ति लंबाई निर्धारित करने का प्रयास कर रहा हूँ:एसक्यूएल सर्वर पंक्ति लंबाई

CREATE TABLE #tmp 
(
    [ID] int, 
    Column_name varchar(640), 
    Type varchar(640), 
    Computed varchar(640), 
    Length int, 
    Prec int, 
    Scale int, 
    Nullable varchar(640), 
    TrimTrailingBlanks varchar(640), 
    FixedLenNullInSource varchar(640), 
    Collation varchar(256) 
) 
INSERT INTO #tmp exec sp_help MyTable 
SELECT SUM(Length) FROM #tmp 
DROP TABLE #tmp 

समस्या यह है कि मैं मेज परिभाषा नहीं जानते है (डेटा प्रकार , आदि ..) तालिका 'sp_help' द्वारा लौटाई गई। sp_help संग्रहीत प्रक्रिया को देखते हुए मुझे किसी भी सुराग नहीं देता

Insert Error: Column name or number of supplied values does not match table definition. 

:

मैं निम्नलिखित त्रुटि मिलती है।

sp_help के परिणामों को सम्मिलित करने के लिए उचित CREATE तालिका विवरण क्या है?

उत्तर

0

मैं sp_help जानकारी संग्रहीत करने के लिए एक temp तालिका बनाने में आपकी सहायता नहीं कर सकता, लेकिन मैं पंक्ति लंबाई की गणना करने में आपकी सहायता कर सकता हूं। यह MSDN article देखें;

मैं: यह आप क्षेत्र लंबाई, प्रकार के आधार पर इस तरह के गणना, आदि शायद बहुत ज्यादा नहीं ले यह एक SQL स्क्रिप्ट आप sysobjects के खिलाफ पूछताछ की पुन: उपयोग कर सकता है, आदि

संपादित में परिवर्तित करने में मदद करता है होगा मैं इसके लिए एक स्क्रिप्ट करने के लिए अपने प्रस्ताव को दोबारा कर रहा हूँ। मेरा रास्ता कहीं भी वेंडोरन के जितना आसान नहीं था। :)

एक तरफ के रूप में, मैंने पहले जो कहा था उसे वापस ले लें, अस्थायी तालिका में मदद करने में सक्षम नहीं होने के कारण। मैं कर सकता हूं: आप इसे नहीं कर सकते। sp_help सात पंक्तियों को आउटपुट करता है, इसलिए मुझे नहीं लगता कि आप प्रारंभिक रूप से मूल प्रश्न में वर्णित कुछ करने में सक्षम होंगे। मुझे लगता है कि आप इसके साथ आने के लिए एक अलग विधि का उपयोग कर अटक गए हैं।

7

इसके बजाय ऐसा कैसे कर रहा है?

CREATE TABLE tblShowContig 
(
    ObjectName CHAR (255), 
    ObjectId INT, 
    IndexName CHAR (255), 
    IndexId INT, 
    Lvl INT, 
    CountPages INT, 
    CountRows INT, 
    MinRecSize INT, 
    MaxRecSize INT, 
    AvgRecSize INT, 
    ForRecCount INT, 
    Extents INT, 
    ExtentSwitches INT, 
    AvgFreeBytes INT, 
    AvgPageDensity INT, 
    ScanDensity DECIMAL, 
    BestCount INT, 
    ActualCount INT, 
    LogicalFrag DECIMAL, 
    ExtentFrag DECIMAL 
) 
GO 

INSERT tblShowContig 
EXEC ('DBCC SHOWCONTIG WITH TABLERESULTS') 
GO 

SELECT * from tblShowContig WHERE ObjectName = 'MyTable' 
GO 
2

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

- सभी स्तंभों की लंबाई योग अप

select SUM(sc.length) 
from syscolumns sc 
inner join systypes st on sc.xtype = st.xtype 
where id = object_id('table') 

- विभिन्न मदों को देखो लौटे

select st.name, sc.* 
from syscolumns sc 
inner join systypes st on sc.xtype = st.xtype 
where id = object_id('table') 

कोई गारंटी हालांकि, लेकिन ऐसा लगता है sp_help 'table' में दिखाई देने वाली वही लंबाई होने के लिए

अस्वीकरण: ध्यान दें कि मैंने जॉन रूडी द्वारा लिखे गए लेख को पढ़ा है और यहां अधिकतम आकारों के अतिरिक्त आपको वास्तविक पंक्ति आकार प्राप्त करने के लिए नल बिटमैप जैसी अन्य चीजों की भी आवश्यकता है। यहां के आकार भी अधिकतम आकार हैं। यदि आपके पास वर्चर कॉलम है तो वास्तविक आकार अधिकांश पंक्तियों पर कम है ....

वेंडोरन का एक अच्छा समाधान है, लेकिन मुझे कहीं भी अधिकतम पंक्ति आकार (तालिका परिभाषा के आधार पर) नहीं दिखाई देता है। मुझे औसत आकार और आवंटन की सभी प्रकार की जानकारी दिखाई देती है जो कि अधिकांश चीज़ों के लिए आपको डीबी आकार का आकलन करने की आवश्यकता होती है।

यदि आप रुचि रखते हैं कि sp_help लंबाई के लिए क्या लौटाता है और इसे जोड़ता है, तो मुझे लगता है कि (मुझे 100% निश्चित नहीं है) कि sysobjects की क्वेरी उन संख्याओं को वापस करती है। क्या वे पूर्ण अधिकतम पंक्ति आकार का प्रतिनिधित्व करते हैं? नहीं, आप नल बिटमैप जैसी चीजें खो रहे हैं। क्या वे आपके वास्तविक डेटा के यथार्थवादी उपाय का प्रतिनिधित्व करते हैं? नहीं। फिर वचरर (500) 500 बाइट्स नहीं लेते हैं यदि आप केवल 100 अक्षर संग्रहित कर रहे हैं। पंक्ति से अलग से संग्रहीत टेक्स्ट फ़ील्ड और अन्य फ़ील्ड भी उनके वास्तविक आकार, सूचक का आकार नहीं दिखाते हैं।

0

यह आपको सारी जानकारी दे देंगे आप की जरूरत

Select * into #mytables 
from INFORMATION_SCHEMA.columns 

select * from #mytables 

drop table #mytables 

अद्यतन:

जवाब मैं दे दिया अधूरा नहीं गलत था। यदि आप लौटाए गए डेटा को देखते हैं तो आपको एहसास होगा कि बाइट्स में पंक्तियों की गणना करने के मामले में आप एक प्रश्न लिख सकते हैं। यह सब आपको चाहिए: डेटाटाइप | आकार | परिशुद्धता। बीओएल में प्रत्येक डेटाटाइप द्वारा उपयोग किए जाने वाले बाइट होते हैं। जब मैं मौका देता हूं तो मैं पूरा उत्तर पोस्ट करूंगा।

2

उपरोक्त में से कोई भी उत्तर सही या मान्य नहीं है।

प्रश्न प्रत्येक कॉलम के डेटा प्रकार द्वारा प्रति पंक्ति खपत बाइट्स की संख्या निर्धारित करने में से एक है।

केवल विधि (रों) मुझे लगता है कि काम कर रहे हैं:

  1. कार्यकारी sp_help 'mytable' - तो दूसरी परिणाम सेट की (लंबाई क्षेत्र को जोड़ने, तो क्वेरी विश्लेषक या प्रबंधन स्टूडियो से काम - बस परिणाम को एक स्प्रेडशीट में कॉपी और पेस्ट करें और एक एसयूएम करें)

  2. एक सी # या वीबी.नेट प्रोग्राम लिखें जो दूसरे परिणामसेट तक पहुंचता है और प्रत्येक पंक्ति के लंबाई क्षेत्र को बताता है।

  3. sp_help के कोड को संशोधित करें।

यह ट्रांजैक्ट एसक्यूएल और sp_help का उपयोग करके नहीं किया जा सकता है क्योंकि एकाधिक परिणामों से निपटने का कोई तरीका नहीं है।

FWIW: resultsets की मेज परिभाषाएँ यहां पाया जा सकता:

http://msdn.microsoft.com/en-us/library/aa933429(SQL.80).aspx