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