2008-12-23 15 views
23

मैं एक sproc (MSSQL 2K5) मिल गया है कि इतने की तरह एक तरह क्लॉस के लिए एक चर ले जाएगा में चर का उपयोग करना:एसक्यूएल की तरह बयान

DECLARE @SearchLetter2 char(1) 
SET @SearchLetter = 't' 
SET @SearchLetter2 = @SearchLetter + '%' 
SELECT * 
    FROM BrandNames 
    WHERE [Name] LIKE @SearchLetter2 and IsVisible = 1 
    --WHERE [Name] LIKE 't%' and IsVisible = 1 
    ORDER BY [Name] 

दुर्भाग्य से, लाइन वर्तमान में चल रहे एक सिंटैक्स त्रुटि फेंकता है, जबकि टिप्पणी की जहां क्लॉज बस ठीक है। क्या कोई मुझे अन-टिप्पणी वाली लाइन काम करने में मदद कर सकता है?

उत्तर

14

जोएल यह है कि @SearchLetter अभी तक घोषित नहीं किया गया है? @ SearchLetter2 की लंबाई 'टी%' के लिए पर्याप्त नहीं है। लंबी लंबाई के वर्चर आज़माएं।

3

घोषित @ SearchLetter2 चार (1)

एक लंबे समय तक चार को यह निर्धारित करें।

3

यह हैनॉर्थविंडनमूना डीबी पर मेरे लिए काम करता है, ध्यान दें कि SearchLetter यह करने के लिए 2 कैरेक्टर हैं और SearchLetter भी इस को चलाने के लिए घोषित किया जाना है:

declare @SearchLetter2 char(2) 
declare @SearchLetter char(1) 
Set @SearchLetter = 'A' 
Set @SearchLetter2 = @SearchLetter+'%' 
select * from Customers where ContactName like @SearchLetter2 and Region='WY' 
1

हम सीधे भी लिख सकते हैं ...

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' 

SELECT * 
FROM CUSTOMERS 
WHERE CONTACTNAME LIKE @SearchLetter + '%' 
     AND REGION = 'WY' 

या निम्नलिखित तरीके के रूप में अच्छी तरह से करता है, तो हमारे पास है तो सभी खोज वर्ण संलग्न करने के लिए,

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' + '%' 

SELECT * 
FROM CUSTOMERS 
WHERE CONTACTNAME LIKE @SearchLetter 
     AND REGION = 'WY' 

इन दोनों आप एक संग्रहीत प्रक्रिया का उपयोग कर रहे हैं, तो काम करेंगे

50

:

ALTER PROCEDURE <Name> 
(
    @PartialName VARCHAR(50) = NULL 
) 

SELECT Name 
    FROM <table> 
    WHERE Name LIKE '%' + @PartialName + '%' 
+0

धन्यवाद। इसने मेरे लिए काम किया – Goldfish

1

लेकिन मेरी राय एक महत्वपूर्ण बात यह है में।

"चार (संख्या)" यह चर का लेंस है।

हम उदाहरण के लिए [Test1..Test200] की तरह "नाम" के साथ तालिका मिल गया है और हम चार की घोषणा (5) की तरह का चयन में हैं:

DECLARE @variable char(5) 
SET @variable = 'Test1%' 
SELECT * FROM table WHERE Name like @variable 

परिणाम केवल होगा - "Test1" ! (चार (5) - लंबाई में 5 वर्ण; टेस्ट 11 है 6)

शेष संभावित रुचि डेटा जैसे [test11..Test200] परिणाम में वापस नहीं किया जाएगा।

यह ठीक है अगर हम इस तरह से चयन को सीमित करना चाहते हैं। लेकिन यदि यह करने का जानबूझकर तरीका नहीं है तो योजनाबद्ध से गलत परिणाम लौटा सकते हैं (जैसे "टेस्ट 1 के साथ शुरू होने वाले सभी नाम ...")। Test1

DECLARE @variable varchar(max) 
SET @variable = 'Test1%' 
SELECT * FROM <table> WHERE variable1 like @variable 

यह रिटर्न (लेकिन यह भी Test11..Test19 और Test100:

मेरी राय में अगर हम एक चयनित मान की सटीक लंबाई पता नहीं है, एक बेहतर समाधान यह एक तरह कुछ हो सकता है ..Test199)।

5

जैसा एंड्रयू Brower लेकिन जोड़ने एक ट्रिम

ALTER PROCEDURE <Name> 
(
    @PartialName VARCHAR(50) = NULL 
) 

SELECT Name 
    FROM <table> 
    WHERE Name LIKE '%' + LTRIM(RTRIM(@PartialName)) + '%' 
संबंधित मुद्दे