2008-08-25 14 views

उत्तर

45

नहीं, लेकिन आप वहां एक फ़ंक्शन बना सकते हैं और इसे हार्डकोड कर सकते हैं और इसका उपयोग कर सकते हैं।

यहाँ एक उदाहरण है:

CREATE FUNCTION fnConstant() 
RETURNS INT 
AS 
BEGIN 
    RETURN 2 
END 
GO 

SELECT dbo.fnConstant() 
+6

'SCHEMABINDING के साथ ** ** ** इसे इसे' असली 'स्थिरता में बदलना चाहिए (यूडीएफ को एसक्यूएल में निर्धारक के रूप में देखा जाना चाहिए)। अर्थात। इसे कैश किया जाना चाहिए। फिर भी, +1। –

0

डेटाबेस साहित्य में "निरंतर बनाना" जैसी कोई चीज़ नहीं है। कॉन्स्टेंट मौजूद हैं क्योंकि वे हैं और अक्सर मूल्य कहा जाता है। कोई एक चर घोषित कर सकता है और इसे एक मान (स्थिर) असाइन कर सकता है। एक शैक्षिक दृश्य से:

DECLARE @two INT 
SET @two = 2 

यहाँ एक चर @two है और 2 एक मूल्य/स्थिर है।

+0

माइकल डी और जॉन निल्सन के प्रदर्शन को बढ़ावा देने के लिए भी प्रयास करें। –

7

नहीं, लेकिन अच्छे पुराने नामकरण सम्मेलनों इस्तेमाल किया जाना चाहिए।

declare @MY_VALUE as int 
+0

वैसे यह वास्तव में पुराना है। ऐसा क्यों लगता है कि यह अच्छा है? –

+0

@VictorYarema क्योंकि कभी-कभी सम्मेलन की आपको आवश्यकता होती है। और क्योंकि कभी-कभी आपके पास कोई अन्य अच्छी पसंद नहीं होती है। अब, उस तरफ, SQLMenace का उत्तर बेहतर दिखता है, मैं आपके साथ सहमत हूं। फिर भी, कार्यों के नाम को स्थिरांक, आईएमओ के लिए सम्मेलन का पालन करना चाहिए। इसे 'FN_CONSTANT() 'नाम दिया जाना चाहिए। इस तरह यह स्पष्ट है कि यह क्या कर रहा है। – tfrascaroli

+0

यह अकेले ही आपकी सहायता नहीं करेगा जब आप प्रदर्शन लाभ चाहते हैं। माइकल डी और जॉन निल्सन के प्रदर्शन को बढ़ावा देने के लिए भी जवाब दें। –

1

ठीक है नहीं, देखें

स्थिरांक अपरिवर्तनीय मान जो संकलन समय पर जाना जाता है और कार्यक्रम

मतलब है कि आप एसक्यूएल सर्वर में एक निरंतर कभी नहीं हो सकता के जीवन के लिए परिवर्तन नहीं करते

declare @myvalue as int 
set @myvalue = 5 
set @myvalue = 10--oops we just changed it 

मूल्य सिर्फ

7

कोई है बदला टी-एसक्यूएल में स्थिरांक के लिए अंतर्निहित समर्थन। आप इसे अनुकरण करने के लिए SQLMenace के दृष्टिकोण का उपयोग कर सकते हैं (हालांकि आप कभी भी यह सुनिश्चित नहीं कर सकते कि किसी और ने फ़ंक्शन को कुछ और वापस करने के लिए ओवरराइट किया है ...), या संभावित रूप से स्थिरांक वाली एक तालिका लिखें, as suggested over here। शायद एक ट्रिगर लिखें जो ConstantValue कॉलम में किसी भी बदलाव को वापस लाता है?

13

लापता कॉन्सन्स के लिए मेरा कामकाज अनुकूलक के मूल्य के बारे में संकेत देना है।

DECLARE @Constant INT = 123; 

SELECT * 
FROM [some_relation] 
WHERE [some_attribute] = @Constant 
OPTION(OPTIMIZE FOR (@Constant = 123)) 

इस क्वेरी संकलक चर के इलाज के लिए जैसे कि यह एक निरंतर था जब निष्पादन योजना बनाने में बताता है। नीचे की ओर यह है कि आपको मूल्य को दो बार परिभाषित करना होगा।

-1

सबसे अच्छा उत्तर SQLMenace से आवश्यकता के अनुसार है यदि स्क्रिप्ट के भीतर उपयोग के लिए अस्थायी स्थिरता बनाना है, यानी कई गो स्टेटमेंट/बैचों में।

बस tempdb में प्रक्रिया बनाएं, फिर आपके पास लक्षित डेटाबेस पर कोई प्रभाव नहीं पड़ता है।

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

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

उदाहरण के लिए:

use tempdb 
go 
create function dbo.MySchemaVersion() 
returns int 
as 
begin 
    return 123 
end 
go 

use master 
go 

-- Big long database create script with multiple batches... 
print 'Creating database schema version ' + CAST(tempdb.dbo.MySchemaVersion() as NVARCHAR) + '...' 
go 
-- ... 
go 
-- ... 
go 
use MyDatabase 
go 

-- Update schema version with constant at end (not normally possible as GO puts 
-- local @variables out of scope) 
insert MyConfigTable values ('SchemaVersion', tempdb.dbo.MySchemaVersion()) 
go 

-- Clean-up 
use tempdb 
drop function MySchemaVersion 
go 
5

किसी SQL समारोह निम्नलिखित स्क्रिप्ट चलाने के प्रदर्शन में अंतर को देखने के लिए प्रयोग से पूर्व:

IF OBJECT_ID('fnFalse') IS NOT NULL 
DROP FUNCTION fnFalse 
GO 

IF OBJECT_ID('fnTrue') IS NOT NULL 
DROP FUNCTION fnTrue 
GO 

CREATE FUNCTION fnTrue() RETURNS INT WITH SCHEMABINDING 
AS 
BEGIN 
RETURN 1 
END 
GO 

CREATE FUNCTION fnFalse() RETURNS INT WITH SCHEMABINDING 
AS 
BEGIN 
RETURN ~ dbo.fnTrue() 
END 
GO 

DECLARE @TimeStart DATETIME = GETDATE() 
DECLARE @Count INT = 100000 
WHILE @Count > 0 BEGIN 
SET @Count -= 1 

DECLARE @Value BIT 
SELECT @Value = dbo.fnTrue() 
IF @Value = 1 
    SELECT @Value = dbo.fnFalse() 
END 
DECLARE @TimeEnd DATETIME = GETDATE() 
PRINT CAST(DATEDIFF(ms, @TimeStart, @TimeEnd) AS VARCHAR) + ' elapsed, using function' 
GO 

DECLARE @TimeStart DATETIME = GETDATE() 
DECLARE @Count INT = 100000 
DECLARE @FALSE AS BIT = 0 
DECLARE @TRUE AS BIT = ~ @FALSE 

WHILE @Count > 0 BEGIN 
SET @Count -= 1 

DECLARE @Value BIT 
SELECT @Value = @TRUE 
IF @Value = 1 
    SELECT @Value = @FALSE 
END 
DECLARE @TimeEnd DATETIME = GETDATE() 
PRINT CAST(DATEDIFF(ms, @TimeStart, @TimeEnd) AS VARCHAR) + ' elapsed, using local variable' 
GO 

DECLARE @TimeStart DATETIME = GETDATE() 
DECLARE @Count INT = 100000 

WHILE @Count > 0 BEGIN 
SET @Count -= 1 

DECLARE @Value BIT 
SELECT @Value = 1 
IF @Value = 1 
    SELECT @Value = 0 
END 
DECLARE @TimeEnd DATETIME = GETDATE() 
PRINT CAST(DATEDIFF(ms, @TimeStart, @TimeEnd) AS VARCHAR) + ' elapsed, using hard coded values' 
GO 
+2

यह काफी पुराना है, लेकिन संदर्भ के लिए मेरे सर्वर पर निष्पादित होने पर परिणाम यहां दिया गया है: | फंक्शन का उपयोग कर '2760ms समाप्त हो गया '| स्थानीय चर का उपयोग करते हुए '2300ms समाप्त हो गया। हार्ड कोडित मानों का उपयोग करके '2286ms समाप्त हो गया '| – z00l

+0

एक देव लैपटॉप पर, स्कीमा बाध्यकारी के बिना दो अतिरिक्त कार्यों के साथ। '' '5570 फंक्शन '' '| का उपयोग कर समाप्त हो गया '' 406 विलुप्त हो गया, स्थानीय चर का उपयोग कर'' | हार्ड कोडित मानों का उपयोग करके '383 समाप्त हो गया '' '' 3893 समाप्त हो गया, स्कीमैबंडिंग के बिना फ़ंक्शन का उपयोग करके ' – user1778606

+0

तुलना के लिए, एक साधारण चयन कथन में 4110ms लगे, जहां चयन कथन कोड 'val' से शीर्ष 1 @m = cv_val के बीच बदलते हैं जहां cv_id = 'C101'' '' और वही '' '... 'सी201'' '' जहां कोड_वॉल्यूज़ 250 वर्रों के साथ शब्दकोश तालिका है, वहां SQL-Server 2016 – user1778606

12

उपयोग छद्म स्थिरांक: http://blogs.msdn.com/b/sql_server_appendix_z/archive/2013/09/16/sql-server-variables-parameters-or-literals-or-constants.aspx

छद्म-स्थिरांक चर या पैरामीटर नहीं हैं। इसके बजाए, वे बस एक पंक्ति के साथ विचार करते हैं, और आपके स्थिरांक का समर्थन करने के लिए पर्याप्त कॉलम हैं। इन सरल नियमों के साथ, SQL इंजन पूरी तरह से दृश्य के मूल्य को अनदेखा करता है लेकिन फिर भी मान के आधार पर निष्पादन योजना बनाता है। निष्पादन योजना दृश्य में शामिल होने को भी नहीं दिखाती है!

4

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

DECLARE @var varchar(100) = 'some text' 
DECLARE @sql varchar(MAX) 
SET @sql = 'SELECT * FROM table WHERE col = '''[email protected]+'''' 
EXEC (@sql) 
+1

पर सभी थे, इस तरह मैं इसे करता हूं और यह उन प्रश्नों के लिए एक बड़ा प्रदर्शन बढ़ावा देता है जिनमें स्थिरांक शामिल हैं । –

1

enums या साधारण स्थिरांक के लिए, एक ही पंक्ति के साथ एक दृश्य के शानदार प्रदर्शन किया है और समय संकलन जाँच/निर्भरता ट्रैकिंग (इसके कारण एक स्तंभ नाम)

देखें जारेड Ko के ब्लॉग पोस्ट https://blogs.msdn.microsoft.com/sql_server_appendix_z/2013/09/16/sql-server-variables-parameters-or-literals-or-constants/

दृश्य

CREATE VIEW ShipMethod.ShipMethodID AS 
SELECT CAST(1 AS INT) AS [XRQ - TRUCK GROUND] 
    ,CAST(2 AS INT) AS [ZY - EXPRESS] 
    ,CAST(3 AS INT) AS [OVERSEAS - DELUXE] 
    , CAST(4 AS INT) AS [OVERNIGHT J-FAST] 
    ,CAST(5 AS INT) AS [CARGO TRANSPORT 5] 

उपयोग दृश्य बनाने

SELECT h.* 
FROM Sales.SalesOrderHeader h 
JOIN ShipMethod.ShipMethodID const 
    ON h.ShipMethodID = const.[OVERNIGHT J-FAST] 
1

चूंकि स्थिरांक के लिए समर्थन में कोई निर्माण नहीं है, इसलिए मेरा समाधान बहुत आसान है।

इस के बाद से समर्थित नहीं है:

Declare Constant @supplement int = 240 
SELECT price + @supplement 
FROM what_does_it_cost 

मैं बस यह

SELECT price + 240/*CONSTANT:supplement*/ 
FROM what_does_it_cost 

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

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