Like的SQL字符串数组参数

Like的SQL字符串数组参数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个MS SQL存储过程,需要将字符串数组传递给该存储过程,以便与LIKE运算符一起使用。我如何才能最好地实现这一点,因为我没有遇到过实现这一点的内置数据类型?我见过一些实现,其中varchar通过一个分隔符传递,而SQL脚本中的逻辑将其拆分并动态构建语句 在我看来,这些实现都不干净,这是如何最好地实现的 谢谢 DECLARE @ContractId int DECLARE @QuantityPerVehicle decimal(18, 4) DECLARE @OrderQuantity d

我有一个MS SQL存储过程,需要将字符串数组传递给该存储过程,以便与LIKE运算符一起使用。我如何才能最好地实现这一点,因为我没有遇到过实现这一点的内置数据类型?我见过一些实现,其中varchar通过一个分隔符传递,而SQL脚本中的逻辑将其拆分并动态构建语句

在我看来,这些实现都不干净,这是如何最好地实现的

谢谢

DECLARE @ContractId int
DECLARE @QuantityPerVehicle decimal(18, 4)
DECLARE @OrderQuantity decimal(18, 4)
DECLARE @OrderDelivered decimal(18, 4)
DECLARE @Description varchar(200)

DECLARE @PendingUsage decimal(18, 4) = 0

DECLARE db_cursor CURSOR FOR select ContractId, QuantityPerVehicle, OrderQuantity, OrderDelivered, Description FROM prod.BillOfMaterialLineDetails where ([description] like '%line item 1%' OR [description] like '%line item 2%' OR [description] like '%line item 3%') and ContractId is not null
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @ContractId, @QuantityPerVehicle, @OrderQuantity, @OrderDelivered, @Description

    WHILE @@FETCH_STATUS = 0
    BEGIN
        DECLARE @JobsRemaining int
        SELECT @JobsRemaining = COUNT(JobId) FROM prod.JobDetails where JobStarted is null and ContractId = @ContractId
        SET @PendingUsage = @PendingUsage + (@JobsRemaining * @QuantityPerVehicle)

        FETCH NEXT FROM db_cursor INTO @ContractId, @QuantityPerVehicle, @OrderQuantity, @OrderDelivered, @Description
    END

CLOSE db_cursor
DEALLOCATE db_cursor


select @PendingUsage as PendingUsage

这个样子对我来说很干净

SELECT contractid, 
       quantitypervehicle, 
       orderquantity, 
       orderdelivered, 
       description 
FROM   prod.billofmateriallinedetails B 
       JOIN (VALUES ('%line item 1%'), 
                    ('%line item 2%'), 
                    ('%line item 3%')) tc(line_item) 
         ON B.description LIKE tc.line_item 
WHERE  contractid IS NOT NULL 

这个样子对我来说很干净

SELECT contractid, 
       quantitypervehicle, 
       orderquantity, 
       orderdelivered, 
       description 
FROM   prod.billofmateriallinedetails B 
       JOIN (VALUES ('%line item 1%'), 
                    ('%line item 2%'), 
                    ('%line item 3%')) tc(line_item) 
         ON B.description LIKE tc.line_item 
WHERE  contractid IS NOT NULL 
你可能想好好读一读。您不应该编写游标从一个表中选择值,然后就可以为每个匹配的值多次查询另一个表。您可能需要继续阅读。您不应该编写游标从一个表中选择值,然后就可以为每个匹配值多次查询另一个表。