2013-05-31 50 views
9

Hy vọng điều này dường như không quá đơn giản. Tôi đã xem xét điều này nhưng tôi không giỏi các hàm do người dùng định nghĩa SQL và việc sử dụng chúng nên tôi không chắc chắn những gì đang diễn ra. Ai tưởng tượng một vài điểm đã nói cho tôi tại sao tôi nhận được lỗi:Chạy hàm do người dùng SQL định nghĩa trả về boolean, trong đó khoản

An expression of non-boolean type specified in a context where a condition is expected, near ')'.

Đối với điều này:

UPDATE LMI_Contact 
SET Phone = NULL 
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0') 

nơi chức năng có thể được tạo ra sử dụng:

-- ***this will also find NULL and empty string values*** 
CREATE FUNCTION LMI_IsSingleCharacterRepeated (@string varchar(max), @char char(1)) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @index int 
    DECLARE @len int 
    DECLARE @currentChar char(1) 
    SET @index = 1 
    SET @len= LEN(@string) 

    WHILE @index <= @len 
    BEGIN 
     SET @currentChar = SUBSTRING(@string, @index, 1) 
     IF @currentChar = @char 
      SET @index= @index+ 1 
     ELSE 
      RETURN 0 
    END 
    RETURN 1 
END; 
GO 

Chức năng này là để kiểm tra xem chuỗi có phải là bất kỳ ký tự đơn nào được chỉ định hay không. Hy vọng ai đó thấy nó hữu ích!

+0

thận trọng - Chức năng của tôi cũng sẽ tìm thấy các lĩnh vực với các giá trị null hoặc một chuỗi rỗng, vì vậy thực sự cần một chút nhiều việc –

Trả lời

17

Bạn phải sử dụng toán tử so sánh với chức năng ngay cả khi kiểu trả về là bit.

UPDATE LMI_Contact 
SET Phone = NULL 
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0') = 1 
3

Hãy thử này

CREATE FUNCTION LMI_IsSingleCharacterRepeated (@str varchar(max), @char char(1)) 
RETURNS BIT 
AS 
BEGIN 
    DECLARE @indx int 
    DECLARE @len int 
    DECLARE @currentChar char(1) 
    SET @indx = 1 
    SET @len= LEN(@str) 

    WHILE @indx <= @len 
    BEGIN 
     SET @currentChar = SUBSTRING(@str, @indx, 1) 
     IF @currentChar = @char 
      SET @indx= @indx+ 1 
     ELSE 
      RETURN 0 
    END 
    RETURN 1 
END; 
GO 
+0

Cảm ơn cho đề xuất. Tôi đã thử điều này, nhưng boolean không phải là một kiểu dữ liệu được công nhận. Tôi đang sử dụng SQL Server 2008 R2 –

+1

Cập nhật lại .. vui lòng kiểm tra. – Ravi

+1

Suy nghĩ tốt và cảm ơn một lần nữa. Sử dụng các từ dành riêng trong truy vấn có thể dễ dàng bắt được nhà phát triển. Trong trường hợp của tôi, đây không phải là vấn đề. Tôi đã upvoted đề nghị là hữu ích :) –

4

Bạn cần phải sửa đổi mệnh đề where của truy vấn của bạn như:

UPDATE LMI_Contact 
SET Phone = NULL 
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0') = 1 
+0

Cảm ơn Nikhil - chỉ bị đánh đến câu trả lời của Thomas, vì vậy tôi đã cho bạn một upvote –

Các vấn đề liên quan