Sql server 2008 r2 如何在SQLServer2008R2中将Varchar转换为Int?

Sql server 2008 r2 如何在SQLServer2008R2中将Varchar转换为Int?,sql-server-2008-r2,Sql Server 2008 R2,过滤索引: CREATE NONCLUSTERED INDEX [FILTEREDIDX_MYTable_OID] ON [dbo].[MYTable] (column3 ASC) INCLUDE (column1, column2) WHERE (column3 IN ((1), (2), (3))) 功能: CREATE FUNCTION [dbo].[funcTest] (@list as varchar(8000), @delim as varchar(10))

过滤索引:

CREATE NONCLUSTERED INDEX [FILTEREDIDX_MYTable_OID] 
ON [dbo].[MYTable] (column3 ASC)
   INCLUDE (column1, column2) 
   WHERE (column3 IN ((1), (2), (3)))
功能:

CREATE FUNCTION [dbo].[funcTest]
    (@list as varchar(8000), @delim as varchar(10))
RETURNS @lTable table(Value INT)
AS
BEGIN
   DECLARE @DelimP INT    
   SET @DelimP = CHARINDEX(@delim, @list)

   WHILE @DelimP > 0
   BEGIN    
       INSERT INTO @lTable(Value) 
       VALUES(CAST(RTRIM(LEFT(@list, @DelimP - 1)) AS INT))    

       SET @list = right(@list, len(@list) - @DelimP)
       SET @DelimP = CHARINDEX(@delim, @list)
   END

   IF len(@list) > 0
      INSERT INTO @lTable(Value)
      VALUES(CAST(RTRIM(@list) AS INT))

   RETURN
END
存储过程:

CREATE PROCEDURE [dbo].[sp_GetList]
    @ParameterString varchar(8000)
AS                              
BEGIN                              
    SET NOCOUNT ON;

    SELECT column1, column2 
    FROM MYTable 
    WHERE column3 IN (SELECT Value 
                      FROM funcTest(@ParameterString,','));
END
当我使用表值函数时,查询是可以的,但不会使用过滤后的索引

我想使用column3int数据类型中的过滤器索引来减少逻辑读取

如果我们只使用参数,则将使用过滤后的索引

Exec sp_GetList '1,2,3'
错误:从列3所在的MYTable中选择列1、列2 @参数字符串

-因为@ParameterString是varchar

错误消息:将varchar值“1,3”转换为数据类型int时,转换失败

好:

SELECT column1, column2 
FROM MYTable 
WHERE column3 IN (1,2,3);
我应该如何解决这个问题?

根据评论

尝试将函数结果加载到表变量中,并连接到该变量:

CREATE PROCEDURE [dbo].[sp_GetList]
@ParameterString varchar(8000)

AS                              
BEGIN                              
SET NOCOUNT ON;

DECLARE @T Table (Value INT)

INSERT INTO @T(Value)
SELECT DISTINCT Value FROM funcTest(@ParameterString,',')

SELECT column1, column2 
FROM MYTable 
INNER JOIN @T T
ON T.Value = column3 

END

那么您从查询计划中观察到没有使用过滤后的索引了吗?如果将函数结果加载到表变量中,然后连接到SP中的该表变量,会发生什么情况?这也可能是参数嗅探的情况-SP缓存了一个不使用过滤索引的计划,并且它坚持该计划。如果我下面的答案准确反映了问题,请标记为AnsweredTanks Nick,它仍然没有使用过滤索引。我如何使用过滤后的索引?你之前的评论说是这样的?我建议您对参数嗅探进行一些研究,看看这是否有帮助。
CREATE PROCEDURE [dbo].[sp_GetList]
@ParameterString varchar(8000)

AS                              
BEGIN                              
SET NOCOUNT ON;

DECLARE @T Table (Value INT)

INSERT INTO @T(Value)
SELECT DISTINCT Value FROM funcTest(@ParameterString,',')

SELECT column1, column2 
FROM MYTable 
INNER JOIN @T T
ON T.Value = column3 

END