2011-06-07 14 views
6

Estoy tratando de crear una función SQL que pruebe si un parámetro comienza con un cierto término o contiene el término, pero no comienza con él.¿Cómo creo una función de SQL Server para devolver un int?

Básicamente, si el parámetro comienza con el término, la función devuelve un 0. De lo contrario, devuelve un 1.

Se trata de los huesos de la función que tengo, que estoy tratando de adaptarse de otro función que encontré:

CREATE FUNCTION [dbo].[fnGetRelevance] 
( 
    @fieldName nvarchar(50), 
    @searchTerm nvarchar(50) 
) 

RETURNS @value int -- this is showing an error, it seems to expect table but all I want is an int 
(
    -- does this need to be here? If so, what should it be? 
) 

AS 

BEGIN 

    declare @field TABLE(Data nvarchar(50)) 

    insert into @field 
     select Data from @fieldName 

    if (Data like @searchTerm + '%') -- starts with 
    begin  
     return 0 
    end 
    else if (Data like '%' + @searchTerm + '%' and Data not like @searchTerm + '%') -- contains, but doesn't start with 
    begin  
     return 1 
    end 

END 

GO 
+0

Parece que usted está tratando de volver 'BIT' (booleano) no' INT'.Aunque hay un tercer estado que no está manejando actualmente; no comienza y no contiene 'searchTerm'. – Jamiec

Respuesta

9

no se proporciona un nombre de variable para el valor de retorno, sólo su tipo, y no son necesarios los parens;

CREATE FUNCTION [dbo].[fnGetRelevance] 
( 
    @fieldName nvarchar(50), 
    @searchTerm nvarchar(50) 
) 

RETURNS int 
AS 
.... 

También;

select Data from @fieldName 

no va a funcionar, se necesitaría dynamic SQL para seleccionar de un objeto cuyo nombre está en una variable.

0

Aquí hay algunos problemas. He agregado comentarios al código a continuación:

CREATE FUNCTION [dbo].[fnGetRelevance] 
( 
    @fieldName nvarchar(50), 
    @searchTerm nvarchar(50) 
) 

RETURNS @value int --Returning an int is fine, but you don't need the @value variable 
(
    --This isn't required (unless you're returning a table) 
) 

AS 

BEGIN 

    declare @field TABLE(Data nvarchar(50)) 

    [email protected] is a varchar, not a table (is this where your error is coming from).  
    --If @fieldname is the name of a table you're going to need to exec a sql string and concat @fieldname into the string 
    insert into @field 
     select Data from @fieldName 

    --You need a variable to contain the value from Data 
    --(ie declare @Data and select @Data = Data) 
    if (Data like @searchTerm + '%') -- starts with 
    begin  
     return 0 
    end 
    else if (Data like '%' + @searchTerm + '%' and Data not like @searchTerm + '%') -- contains, but doesn't start with 
    begin  
     return 1 
    end 

END 

Esto debería acercarlo un poco más a lo que está tratando de lograr.

0

estoy tratando de crear una función de SQL que pone a prueba si un parámetro comienza con un cierto plazo o contiene el término , pero no se inicia con ella.

Im asumiendo lo siguiente:

  • @fieldName es en realidad un nombre de tabla (a juzgar por su intento de uso).
  • @searchterm es el término que busca
  • Data es una columna en la tabla @fieldName

Si cualquiera de los anteriores son incorrectas, esta respuesta es relincho-en inútil.

Necesitará utilizar sql dinámico ya que la tabla en una consulta de selección no se puede parametrizar. Necesitará 2 versiones diferentes del sql dinámico, como desea comprobar "comienza con" y más general "contiene". Necesitará una variable de salida del sql dinámico para determinar el resultado de la llamada.

Como asside, INT es un exceso total en términos de tamaño. Si tiene solo 2 estados (que dudo) que desee BIT, si tiene 3 estados (como sospecho) desea TINYINT. Me quedaré con int por ahora para estar cerca de tu ejemplo original, pero considera cambiarlo.

CREATE FUNCTION [dbo].[fnGetRelevance] 
( 
    @fieldName nvarchar(50), 
    @searchTerm nvarchar(50) 
) 
RETURNS INT 
AS 
BEGIN 

    DECLARE @startsWithResult INT, 
      @containsResult INT 
    DECLARE @startsWithSQL NVARCHAR(MAX) = N'SELECT @result=1 FROM ' + @fieldName + ' WHERE Data LIKE '' + @searchTerm + '%''' 
    DECLARE @containsSQL NVARCHAR(MAX) = N'SELECT @result=1 FROM ' + @fieldName + ' WHERE Data LIKE ''%' + @searchTerm + '%''' 

    EXEC sp_ExecuteSQL @startsWithSQL, N'@result int output', @result = @startsWithResult OUTPUT 

    IF @startsWithResult = 1 
    RETURN 0 

    EXEC sp_ExecuteSQL @containsSQL, N'@result int output', @result = @containsResult OUTPUT 

    IF @containsResult = 1 
    RETURN 1 

END 
0

de remisión, esta es la función completa tal como se aplica a las sugerencias de Alex K

CREATE FUNCTION [dbo].[fnGetRelevance] 
( 
    @fieldName nvarchar(50), 
    @searchTerm nvarchar(50) 
) 

RETURNS int 
AS 
BEGIN 
    if (@fieldName like @searchTerm + '%') -- starts with 
    begin  
     return 0 
    end 
    else if ((@fieldName like '%' + @searchTerm + '%') and (@fieldName not like @searchTerm + '%')) -- contains, but doesn't start with 
    begin  
     return 1 
    end 

    return 1 
END 

GO 
Cuestiones relacionadas