Asp.net 在SQL函数中强制转换值
我有一个问题,我将NVARCHAR参数传递给一个存储过程,而表中该参数的字段类型是INT 我这样做是因为我在函数中使用,例如,如果我想发送多个参数,这是通过.NET实现的唯一可能的方法。还是不? 由于类型错误,SP无法执行,我正在尝试强制转换该值,但出现错误。以下是我的尝试: 例如:Asp.net 在SQL函数中强制转换值,asp.net,sql,sql-server,tsql,stored-procedures,Asp.net,Sql,Sql Server,Tsql,Stored Procedures,我有一个问题,我将NVARCHAR参数传递给一个存储过程,而表中该参数的字段类型是INT 我这样做是因为我在函数中使用,例如,如果我想发送多个参数,这是通过.NET实现的唯一可能的方法。还是不? 由于类型错误,SP无法执行,我正在尝试强制转换该值,但出现错误。以下是我的尝试: 例如: @Parameter nvarchar OrderStatusID = ('30, 40') (o.OrderStatusID IN (CAST(@OrderStatusID as int)) OR @Order
@Parameter nvarchar OrderStatusID = ('30, 40')
(o.OrderStatusID IN (CAST(@OrderStatusID as int)) OR @OrderStatusID IS NULL)
是否有一种方法可以单独转换每个值,或者将整个值转换为INT的最佳方法。最好的方法是将输入参数转换为一个表,然后在该表上使用in语句 例如,您可以使用CTE来执行此操作
WITH CTE ( pos, pos_begin, pos_end ) AS
(
SELECT 0, 1, CHARINDEX( ',', @p + ',' )
UNION ALL
SELECT pos + 1, pos_end + 1, CHARINDEX( ',', @p + ',', pos_end + 1 )
FROM CTE
WHERE CHARINDEX( ',', @p + ',', pos_end + 1 ) > 0
), numList as
(
SELECT SUBSTRING( @p, pos_begin , pos_end - pos_begin ) AS "value"
FROM CTE
)
SELECT -- whatever you want
WHERE (o.OrderStatusID IN (SELECT CAST(value AS int) FROM numList)) OR @p is NULL
还有其他方法可以做到这一点,请阅读这里的许多其他技术——这是从哪里改编的。
(注意,由于我在示例页面中采用了此快捷方式,因此我没有对其进行优化,很明显CTE可以变得更简单,从而更快。)
我通常会这样做
SET @OrderStatusId = ','+@OrderStatusID+','
CharIndex(','+trim(str(o.OrderStatus))+',' , @OrderStatusId) >0
但这并不是很快,在WHERE子句中使用函数会影响性能。Emtucifor有一个链接表明,在测试数千个值时,递归CTE几乎不比游标循环好。
SET @OrderStatusId = ','+@OrderStatusID+','
CharIndex(','+trim(str(o.OrderStatus))+',' , @OrderStatusId) >0