यहाँ एक दृष्टिकोण है कि मूल रूप से @ JNK के लिए इसी तरह की, लेकिन इसके बजाय मायने रखता है यह हर स्तंभ है जो आपको बताता के लिए एक तैयार जवाब देता है मुद्रण की है एक कॉलम केवल या नहीं अनन्य मानों के होते हैं या नहीं:
DECLARE @table varchar(100), @sql varchar(max);
SET @table = 'some table name';
SELECT
@sql = COALESCE(@sql + ', ', '') + ColumnExpression
FROM (
SELECT
ColumnExpression =
'CASE COUNT(DISTINCT ' + COLUMN_NAME + ') ' +
'WHEN COUNT(*) THEN ''UNIQUE'' ' +
'ELSE '''' ' +
'END AS ' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table
) s
SET @sql = 'SELECT ' + @sql + ' FROM ' + @table;
PRINT @sql; /* in case you want to have a look at the resulting query */
EXEC(@sql);
यह प्रत्येक कॉलम के लिए COUNT(*)
के साथ COUNT(DISTINCT column)
की तुलना करता है। परिणाम एक पंक्ति के साथ एक तालिका होगी, जहां प्रत्येक कॉलम में उन कॉलम के लिए UNIQUE
मान होगा जिसमें डुप्लिकेट नहीं होंगे, और डुप्लीकेट मौजूद होने पर खाली स्ट्रिंग होगी।
लेकिन उपर्युक्त समाधान केवल उन स्तंभों के लिए सही ढंग से काम करेगा जिनके पास न्यूल नहीं है।यह ध्यान दिया जाना चाहिए कि जब आप कॉलम पर एक अद्वितीय बाधा/अनुक्रमणिका बनाना चाहते हैं तो SQL सर्वर NULL को अनदेखा नहीं करता है। यदि किसी कॉलम में केवल एक नल होता है और अन्य सभी मान अनूठे होते हैं, तो आप अभी भी कॉलम पर एक अनूठी बाधा बना सकते हैं (आप इसे प्राथमिक कुंजी नहीं बना सकते हैं, हालांकि, मूल्यों की असीमितता और एनयूएलएल की अनुपस्थिति दोनों की आवश्यकता होती है)।
इसलिए आप सामग्री है, जिसे आप निम्न स्क्रिप्ट के साथ मिल सकता है की एक और अधिक गहन विश्लेषण की आवश्यकता हो सकती: COUNT(DISTINCT column)
, COUNT(column)
और COUNT(*)
:
DECLARE @table varchar(100), @sql varchar(max);
SET @table = 'some table name';
SELECT
@sql = COALESCE(@sql + ', ', '') + ColumnExpression
FROM (
SELECT
ColumnExpression =
'CASE COUNT(DISTINCT ' + COLUMN_NAME + ') ' +
'WHEN COUNT(*) THEN ''UNIQUE'' ' +
'WHEN COUNT(*) - 1 THEN ' +
'CASE COUNT(DISTINCT ' + COLUMN_NAME + ') ' +
'WHEN COUNT(' + COLUMN_NAME + ') THEN ''UNIQUE WITH SINGLE NULL'' ' +
'ELSE '''' ' +
'END ' +
'WHEN COUNT(' + COLUMN_NAME + ') THEN ''UNIQUE with NULLs'' ' +
'ELSE '''' ' +
'END AS ' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table
) s
SET @sql = 'SELECT ' + @sql + ' FROM ' + @table;
PRINT @sql; /* in case you still want to have a look at the resulting query */
EXEC(@sql);
यह समाधान तीन मानों की जाँच करके खाते में NULLs लेता है। यह पूर्व समाधान की तरह ही परिणाम प्रदर्शित करता है, लेकिन स्तंभों के लिए संभव निदान अधिक विविधता होती है:
UNIQUE
मतलब है कि कोई डुप्लिकेट मानों और कोई NULLs (या तो पी है या एक अनूठा बाधा/सूचकांक हो सकते हैं) ;
UNIQUE WITH SINGLE NULL
- अनुमान लगाया जा सकता है, कोई डुप्लीकेट नहीं है, लेकिन एक नल है (पीके नहीं हो सकता है, लेकिन एक अद्वितीय बाधा/सूचकांक हो सकता है);
UNIQUE with NULLs
- कोई डुप्लीकेट नहीं, दो या अधिक NULLs (यदि आप SQL Server 2008 पर हैं, तो आपके पास केवल गैर-नल मानों के लिए एक सशर्त अद्वितीय अनुक्रमणिका हो सकती है);
खाली स्ट्रिंग - डुप्लिकेट हैं, संभवतः एनयूएलएल भी हैं।
स्रोत
2011-08-04 14:20:06
त्रुटि दे रहा है "चेतावनी: कुल मूल्य एक कुल या अन्य एसईटी ऑपरेशन द्वारा समाप्त किया गया है।" आवेदन से उपयोग नहीं किया जा सकता है। – ratneshsinghparihar
@ user998660: "आवेदन से विशेष रूप से चेतावनियों के प्रति संवेदनशील", आपका मतलब है? उस मामले में, नहीं, यह निश्चित रूप से नहीं कर सकता है। सभी अनुप्रयोग * * संवेदनशील नहीं हैं, हालांकि। उदाहरण के लिए, मुझे कभी भी ऐसी चेतावनियां उत्पन्न करने वाले समेकन वाले डेल्फी में समस्याएं याद नहीं हैं। वैसे भी, मेरी धारणा यह थी कि ओपी एक समाधान चाहता था जिसे वे "मैन्युअल रूप से" उपयोग कर सकते थे, उदाहरण के लिए, किसी प्रश्न के मामले में, इसे एसएसएमएस जैसे टूल में आमंत्रित करना। –