Вызов функции SQL, возвращающий неожиданный результат - PullRequest
0 голосов
/ 11 ноября 2010

Возникли проблемы с вызовом функции, пожалуйста. У меня есть ситуация, которую я пока не могу понять. У меня есть простой вызов функции, как это. , .

If(@confirm ='Y') 
 BEGIN 
  SELECT  dbo.ReplaceString(@rawText, '2342345432', 'radefr', @User_no, @password,@email,' ',' ',GetDate() ,@company, @end,  @start, @remove) as messagetext 
 END

Мне удалось убедиться, что функция работает нормально, так как все, что она делает - это простая замена строки с использованием переданных параметров. Проблема, с которой я столкнулся, заключается в том, что при подключении вызова, как указано выше, я получаю возвращенное нулевое значение вместо строки, переданной изначально, как и ожидалось. За исключением любых ошибок в коде, есть ли другая ситуация, когда функция возвращает неожиданный результат?

  Function [dbo].[ReplaceString]
(
            @rawtext As Varchar(400), 
            @numbernum As Varchar(15), 
            @name As Varchar(25),   
            @userno As Bigint,  
            @password As Varchar(50) ,
            @email As Varchar(50) ,
            @keyword As VARCHAR(40),
            @litext As Varchar(500), 
            @datecreated As DateTime, 
            @company As Varchar(30), 
            @end As Varchar(140), 
            @start  As Varchar(140), 
            @remove As Varchar(200)

)
RETURNS VARCHAR(450)
AS 
BEGIN 

            SELECT @rawtext  = Replace( @rawtext , ''@@name@@'', @ name)
            SELECT @rawtext  = Replace( @rawtext , ''@@number@@'', @numbernum)
            SELECT @rawtext  = Replace( @rawtext , ''@@company@@'', @company )
            SELECT @rawtext  = Replace( @rawtext , ''@@ssn@@'', @numbernum )
            SELECT @rawtext  = Replace( @rawtext , ''@@message@@'', @littext )
            SELECT @rawtext  = Replace( @rawtext , ''@@date@@'', CAST(@datecreated AS VARCHAR(10)) )

            SELECT @rawtext  = Replace( @rawtext , ''@@keyword@@'', @ keyword )
            SELECT @message_text = Replace(@littext, @ keyword, '''' )
            SELECT @rawtext  = Replace( @rawtext , ''@@withoutkeyword@@'', @littext)
            SELECT @remove= Replace(@remove ''@@company@@'', @company)
            SELECT @start= Replace(@start, ''@@company@@'', @company)  
            SELECT @end = Replace(@end, ''@@company@@'', @company ) 
            SELECT @rawtext  = Replace( @rawtext , ''@@Settings[END]@@'',@end )
            SELECT @rawtext  = Replace( @rawtext , ''@@Settings[START]@@'', @start )
            SELECT @rawtext  = Replace( @rawtext , ''@@Settings[REMOVE]@@'', @remove)


         RETURN(@rawtext )

Ответы [ 5 ]

3 голосов
/ 11 ноября 2010

NULL имеет привычку распространяться на серверах БД; многие операции (в частности, конкатенация) будут возвращать NULL, если один, если входные данные NULL, требующие ISNULL или COALESCE. Так

  • каково значение @confirm - и что такое сопоставление в БД (чувствительно ли оно к регистру? A 'y' не будет совпадать при сопоставлении с учетом регистра)
  • что делает ReplaceString делает (в идеале: код)
  • каковы значения @rawText, @User_no, @password, @email и т. Д ...
3 голосов
/ 11 ноября 2010

Значение NARLL varchar, совпадающее с любым другим значением, дает значение NULL.

Таким образом, один из переданных параметров, который является сцепленным, вероятно, равен NULL

2 голосов
/ 11 ноября 2010

, если какая-либо из переменных, использованных в замене, может быть нулевой, и вы не заключите их в isnull или coalesce, вы можете столкнуться с такой проблемой.

1 голос
/ 11 ноября 2010

Исходя из вашего недавнего редактирования, описанную вами функцию невозможно будет создать. Это близко к тому, что вы намеревались? Если бы вы могли предоставить рабочий пример своей функции и значения @ rawtext , которое вы ей передаете, это помогло бы выяснить вашу проблему.

CREATE FUNCTION [dbo].[ReplaceString]
(
     @rawtext       VarChar(400)
    ,@numbernum     VarChar(15)
    ,@name          VarChar(25)  
    ,@userno        BigInt 
    ,@password      VarChar(50)
    ,@email         VarChar(50)
    ,@keyword       VarChar(40)
    ,@litext        VarChar(500)
    ,@datecreated   DateTime
    ,@company       VarChar(30)
    ,@end           VarChar(140)
    ,@start         VarChar(140)
    ,@remove        VarChar(200)
)
RETURNS VarChar(450)
As
Begin

    Declare @result VarChar(450)

    -- Set default values for null parameters
    Select
             @rawtext       = IsNull(@rawtext, '')
            ,@numbernum     = IsNull(@numbernum, '')
            ,@name          = IsNull(@name, '')
            ,@userno        = IsNull(@userno, 0)
            ,@password      = IsNull(@password, '')
            ,@email         = IsNull(@email, '')
            ,@keyword       = IsNull(@keyword, '')
            ,@litext        = IsNull(@litext, '')
            ,@datecreated   = IsNull(@datecreated, GetDate())
            ,@company       = IsNull(@company, '')
            ,@end           = IsNull(@end, '')
            ,@start         = IsNull(@start, '')
            ,@remove        = IsNull(@remove, '')

    Select @result  = Replace( @rawtext , '@@name@@', @name) 
    Select @result  = Replace( @result , '@@number@@', @numbernum) 
    Select @result  = Replace( @result , '@@company@@', @company ) 
    Select @result  = Replace( @result , '@@ssn@@', @numbernum ) 
    Select @result  = Replace( @result , '@@message@@', @litext ) 
    Select @result  = Replace( @result , '@@date@@', CAST(@datecreated As VarChar(10)) )

    Select @result          = Replace( @result , '@@keyword@@', @keyword ) 
    Select @result          = Replace(@litext, @keyword, '''' ) 
    Select @result          = Replace( @result , '@@withoutkeyword@@', @litext) 
    Select @remove          = Replace(@remove, '@@company@@', @company) 
    Select @start           = Replace(@start, '@@company@@', @company)   
    Select @end             = Replace(@end, '@@company@@', @company )  
    Select @result          = Replace( @result , '@@Settings[END]@@',@end ) 
    Select @result          = Replace( @result , '@@Settings[START]@@', @start ) 
    Select @result          = Replace( @result , '@@Settings[REMOVE]@@', @remove)

    Return @result
End
Go

Документация по REPLACE указывает, что возвращает NULL, если любой из аргументов равен NULL . Вам следует рассмотреть возможность использования функции ReplaceString с помощью функции ISNULL для замены любых входных данных ненулевыми значениями, такими как пустая строка.

Declare @value nvarchar(10),
        @expression nvarchar(10),
        @replacement nvarchar(10)

Select  @value          = 'Some Value',
        @expression     = Null,
        @replacement    = 'Value2'

-- Result is NULL
Select REPLACE(@value, @expression, @replacement) as 'Result'

Select  @expression = 'Value'

-- Result is 'Some Value2'
Select REPLACE(@value, @expression, @replacement) as 'Result'
0 голосов
/ 11 ноября 2010

Я не думаю, что это правильное использование SQL, если это не академическое упражнение.Это не ремонтопригодно.Это должна быть функция CLR или внешняя функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...