लंबी पोस्ट के लिए क्षमा करें, लेकिन मुझे समस्या को दर्शाने के लिए कुछ कोड पोस्ट करने की आवश्यकता है।"टेबल से बनाम" चयन करें "तालिका से" कोला, कोल्ब इत्यादि का चयन करें "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) नामों के विपरीत कॉलम मैप किए जाते हैं।
मैंने सोचा कि मैं इसे अपने एसक्यूएल में चुनिंदा * का उपयोग करके लोगों के लिए एक चेतावनी के रूप में पोस्ट करूँगा और अप्रत्याशित व्यवहार का अनुभव कर रहा हूं।
नोट: यदि आप उस दृश्य को पुनर्निर्माण करते हैं जो तालिका को संशोधित करने के बाद प्रत्येक बार चयन * का उपयोग करता है, तो यह अपेक्षित कार्य करेगा।
मुझे यह नहीं मिला, उदाहरण कोड में कहीं भी कोई कॉलम डी नहीं है। – Hogan
@ होगन आपको कोड उदाहरण को स्क्रॉल करने की आवश्यकता है, तालिका स्टारटेस्ट ड्रॉप और फिर से बनाया गया है, इस बार 4 कॉलम के साथ: ए, बी, डी, सी – kristof
धन्यवाद, मुझे नहीं पता कि मुझे यह कैसे याद आया। – Hogan