Procedimiento almacenado de SQL Server
-
03-07-2019 - |
Pregunta
Me gustaría saber si alguno de ustedes tiene una idea para hacer lo siguiente: Tengo una tabla que contiene algunas definiciones de carde [id] [Compañía] [Modo], esto podría p. Ej. ser Audi 100, Ford Mustan, etc. Luego tengo otro campo que es una cadena que contiene tanto el auto como el modelo, este podría ser "Ford Mustang 2.5T", entonces necesito encontrar la identificación correcta de la definición del auto. Pensé en hacer
@CarDefintion = "Ford Mustang 2.5T"
Select top 1 CarDefinitionId
from dbo.CarModelDefinition
where CONTAINS(Model,@Cardefinition)
AND Contains(Company, @Cardefinition)
Pero como Model + Company no es único, aparece este error: " No se puede usar un predicado CONTAINS o FREETEXT en la tabla o vista indexada 'dbo.CarModelDefinition' porque no está indexado en texto completo. " ¿Alguien tiene una idea de cómo puedo resolver esto?
Solución
Busque la cadena con los valores de las columnas con caracteres comodín usando LIKE
.
@CarDefintion = "Ford Mustang 2.5T"
Select top 1 CarDefinitionId
from dbo.CarModelDefinition
where @Cardefinition like '%' + model + '%'
AND @Cardefinition like '%' + company + '%';
+
es el operador de cateación de cadenas.
Otros consejos
@CarDefintion = "Ford Mustang 2.5T"
Select top 1 CarDefinitionId
from dbo.CarModelDefinition
where @Cardefinition LIKE Model OR @Cardefinition LIKE Company
¿Debe @CarDefintion ser una cadena? ¿Sería posible convertirlo en una matriz de Modelo y Compañía a la que luego podría hacer referencia en su SQL?
De lo contrario, estarías absolutamente seguro de que alguien no solo pone "Mustang 2.5T" en lugar de "Ford Mustang 2.5T" Si puede estar absolutamente seguro de que una forma de hacerlo es dividir por espacios, haga una serie de búsquedas en cada segmento para intentar localizarlo.
DECLARE @CarDefintion VARCHAR(25)
SET @CarDefintion = 'Ford Mustang 2.5T'
DECLARE @Make VARCHAR(25)
DECLARE @Model VARCHAR(25)
SELECT @Make = SUBSTRING(@CarDefintion,0,CHARINDEX(' ',REVERSE(@CarDefintion)))
SELECT @Model = LTRIM( REPLACE(@CarDefintion,@Make,''))
--SELECT @Make,@Model
SELECT TOP 1 *
FROM dbo.CarModelDefinition
WHERE Model = @Model
AND Company = @Make
Las funciones CONTAINS () son para la búsqueda de texto completo, que probablemente no estés usando (por lo tanto, los errores)