Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在SQL函数中强制转换值_Asp.net_Sql_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Asp.net 在SQL函数中强制转换值

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

我有一个问题,我将NVARCHAR参数传递给一个存储过程,而表中该参数的字段类型是INT

我这样做是因为我在函数中使用,例如,如果我想发送多个参数,这是通过.NET实现的唯一可能的方法。还是不? 由于类型错误,SP无法执行,我正在尝试强制转换该值,但出现错误。以下是我的尝试: 例如:

@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