2008-12-23 28 views
23

Tôi đã có một sproc (MSSQL 2k5) sẽ đưa một biến cho một claus NHƯ như vậy:Sử dụng biến trong SQL tương tự tuyên bố

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] 

Thật không may, hàng hiện đang chạy ném một lỗi cú pháp, trong khi bình luận where where chạy tốt. Bất cứ ai có thể giúp tôi nhận được dòng un-comment làm việc?

Trả lời

14

Joel có phải là @SearchLetter chưa được khai báo không? Ngoài ra, độ dài của @ SearchLetter2 không đủ dài cho 't%'. Hãy thử một varchar có chiều dài dài hơn.

3

DECLARE @ SearchLetter2 char (1)

Đặt giá trị này thành giá trị dài hơn.

3

này làm việc cho tôi trên mẫu DB Northwind, lưu ý rằng SearchLetter có 2 ký tự để nó và SearchLetter cũng phải được khai báo cho điều này để chạy:

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

Chúng tôi có thể viết trực tiếp quá ...

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' 

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

hoặc theo cách sau cũng như nếu chúng ta phải thêm tất cả các ký tự tìm kiếm sau đó,

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' + '%' 

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

Cả hai sẽ làm việc

50

Nếu bạn đang sử dụng một Stored Procedure:

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

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

Cảm ơn. nó đã làm cho tôi – Goldfish

1

Nhưng theo ý kiến ​​của một điều quan trọng tôi.

"char (number)" là chiều dài của biến.

Nếu chúng tôi đã có bảng với "Tên" như ví dụ [Test1..Test200] và chúng ta khai báo char (5) trong SELECT như sau:

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

kết quả sẽ là duy nhất - "Test1" ! (char (5) - 5 ký tự trong chiều dài; Test11 là 6)

Phần còn lại của dữ liệu quan tâm tiềm năng như [Test11..Test200] sẽ không được trả lại trong kết quả.

Sẽ ổn nếu chúng tôi muốn giới hạn SELECT theo cách này. Nhưng nếu nó không có ý định thực hiện nó có thể trả lại kết quả không chính xác từ kế hoạch (Giống như "tất cả Tên bắt đầu bằng Test1 ...").

Theo tôi, nếu chúng ta không biết chính xác chiều dài của một giá trị được lựa chọn, một giải pháp tốt hơn có thể là một cái gì đó như thế này:

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

lợi nhuận này (Test1 mà còn Test11..Test19 và Test100 ..Test199).

5

Giống như Andrew Brower nhưng thêm một trim

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

SELECT Name 
    FROM <table> 
    WHERE Name LIKE '%' + LTRIM(RTRIM(@PartialName)) + '%' 
Các vấn đề liên quan