2008-11-26 9 views
14

लंबी पोस्ट के लिए क्षमा करें, लेकिन मुझे समस्या को दर्शाने के लिए कुछ कोड पोस्ट करने की आवश्यकता है।"टेबल से बनाम" चयन करें "तालिका से" कोला, कोल्ब इत्यादि का चयन करें "SQL सर्वर 2005 में दिलचस्प व्यवहार

प्रश्न से प्रेरित * What is the reason not to use select ?, मैंने कुछ समय पहले चयनित * व्यवहार के कुछ अवलोकनों को इंगित करने का निर्णय लिया।

तो जाने कोड खुद के लिए बोलते हैं क्या है:

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[starTest]') AND type in (N'U')) 
DROP TABLE [dbo].[starTest] 
CREATE TABLE [dbo].[starTest](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [A] [varchar](50) NULL, 
    [B] [varchar](50) NULL, 
    [C] [varchar](50) NULL 
) ON [PRIMARY] 

GO 

insert into dbo.starTest(a,b,c) 
select 'a1','b1','c1' 
union all select 'a2','b2','c2' 
union all select 'a3','b3','c3' 

go 
IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vStartest]')) 
DROP VIEW [dbo].[vStartest] 
go 
create view dbo.vStartest as 
select * from dbo.starTest 
go 

go 
IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vExplicittest]')) 
DROP VIEW [dbo].[vExplicittest] 
go 
create view dbo.[vExplicittest] as 
select a,b,c from dbo.starTest 
go 


select a,b,c from dbo.vStartest 
select a,b,c from dbo.vExplicitTest 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[starTest]') AND type in (N'U')) 
DROP TABLE [dbo].[starTest] 
CREATE TABLE [dbo].[starTest](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [A] [varchar](50) NULL, 
    [B] [varchar](50) NULL, 
    [D] [varchar](50) NULL, 
    [C] [varchar](50) NULL 
) ON [PRIMARY] 

GO 

insert into dbo.starTest(a,b,d,c) 
select 'a1','b1','d1','c1' 
union all select 'a2','b2','d2','c2' 
union all select 'a3','b3','d3','c3' 

select a,b,c from dbo.vExplicittest 
select a,b,c from dbo.vStartest 

आप निम्न क्वेरी निष्पादित और पिछले 2 का चयन करें बयान, परिणाम है कि आप हो जाएगा इस प्रकार देखेंगे के परिणामों को देखें, तो:

select a,b,c from dbo.vExplicittest 
a1 b1 c1 
a2 b2 c2 
a3 b3 c3 

select a,b,c from dbo.vStartest 
a1 b1 d1 
a2 b2 d2 
a3 b3 d3 

आप के परिणामों में देख सकते हैं का चयन क, ख, dbo.vStartest से ग स्तंभ सी के डेटा colum घ से डेटा के साथ प्रतिस्थापित किया गया है।

मेरा मानना ​​है कि विचारों को संकलित करने के तरीके से संबंधित है, मेरी समझ यह है कि कॉलम इंडेक्स (1,2,3,4) नामों के विपरीत कॉलम मैप किए जाते हैं।

मैंने सोचा कि मैं इसे अपने एसक्यूएल में चुनिंदा * का उपयोग करके लोगों के लिए एक चेतावनी के रूप में पोस्ट करूँगा और अप्रत्याशित व्यवहार का अनुभव कर रहा हूं।

नोट: यदि आप उस दृश्य को पुनर्निर्माण करते हैं जो तालिका को संशोधित करने के बाद प्रत्येक बार चयन * का उपयोग करता है, तो यह अपेक्षित कार्य करेगा।

+1

मुझे यह नहीं मिला, उदाहरण कोड में कहीं भी कोई कॉलम डी नहीं है। – Hogan

+1

@ होगन आपको कोड उदाहरण को स्क्रॉल करने की आवश्यकता है, तालिका स्टारटेस्ट ड्रॉप और फिर से बनाया गया है, इस बार 4 कॉलम के साथ: ए, बी, डी, सी – kristof

+0

धन्यवाद, मुझे नहीं पता कि मुझे यह कैसे याद आया। – Hogan

उत्तर

15

sp_refreshview दृश्य ठीक करना, या दृश्य परिभाषा

तो एक दृश्य SCHEMABINDING खंड के साथ नहीं बनाया गया है में SCHEMABINDING के साथ उपयोग करने के लिए, sp_refreshview परिवर्तन वस्तुओं अंतर्निहित करने के लिए बना रहे हैं जब चलाने की जानी चाहिए दृश्य दृश्य की परिभाषा को प्रभावित करता है। अन्यथा, दृश्य अनपेक्षित परिणाम उत्पन्न होने पर उत्पन्न हो सकता है।

+0

मैं जोड़ता हूं, उत्पादन कोड – kristof

+0

अच्छा बिंदु में SELECT * का उपयोग न करें। मैं हमेशा SCHEMABINDING का उपयोग करता हूं जो इसकी अनुमति नहीं देता है – gbn

2

यह तहत विचारों के लिए बहुत मानक व्यवहार किसी भी आरडीबीएमएस ही नहीं, MSSQL, और कारण है कि जिसमें विचारों का उपयोग "से * का चयन करें" सावधानी के साथ इलाज किया जाना चाहिए है।

एसक्यूएल इंजन प्रत्येक दृश्य को संकलित करेगा - जो मूल रूप से लेक्सिकोोग्राफिक/पार्सिंग चरण है और इसका परिणाम संग्रहित करता है। यदि आप अंतर्निहित तालिकाओं को बदलते हैं तो एक स्पष्ट पुन: संकलन हमेशा तब तक जरूरी होता है जब तक डेटाबेस में इस तरह की परिस्थितियों में जांच के रूप में दृश्य को टैग करने की कोई विधि न हो।

समस्या (संग्रहित) संग्रहीत प्रक्रियाओं और समान डेटाबेस ऑब्जेक्ट्स पर भी लागू हो सकती है।

संबंधित मुद्दे