Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
Sql 当涉及到存储过程优化时,是否可以替代join中的强制转换功能?_Sql_Sql Server - Fatal编程技术网

Sql 当涉及到存储过程优化时,是否可以替代join中的强制转换功能?

Sql 当涉及到存储过程优化时,是否可以替代join中的强制转换功能?,sql,sql-server,Sql,Sql Server,在使用联接的存储过程中,用于转换SQL查询中的数据类型的cast函数的最佳替代方法是什么 我经常读到使用函数不好,需要帮助优化下面的查询 SELECT A.DATE, A.Value curr , ISNULL( CAST( CONVERT ( DECIMAL(18,4), CASE WHEN @INV = 0 THEN NULLIF(ISNULL(tblRate.currBid,0),0) ELSE 1.00 / NULLIF(ISNULL

在使用联接的存储过程中,用于转换SQL查询中的数据类型的cast函数的最佳替代方法是什么

我经常读到使用函数不好,需要帮助优化下面的查询

SELECT 
    A.DATE,
    A.Value curr , 
     ISNULL( CAST( CONVERT ( DECIMAL(18,4),  CASE WHEN @INV = 0 THEN   NULLIF(ISNULL(tblRate.currBid,0),0)     ELSE  1.00  /    NULLIF(ISNULL(tblRate.currBid,0) ,0)  END  ) AS VARCHAR) ,@TempHardcodeValue)  AS  currBid,
     A.Value +' - '+ A.currName As ConcatenatedCurr
FROM #TEMPTable A
LEFT JOIN  tblCurrRates (NOLOCK) tblRate ON A.Date = cast(tblRate.currDate as date) AND A.currCode = tblRate.currCode
ORDER BY A.Date ,A.Value

正如您所看到的,使用了强制转换函数,那么有没有其他方法可以在不使用强制转换的情况下重新写入?

实际上,SQL Server可能可以使用强制转换。使用函数的一个例外是将日期/时间强制转换为日期——SQL Server识别使用索引的转换

但是,你可以做到:

FROM #TEMPTable A LEFT JOIN 
     tblCurrRates r
     ON r.currDate >= A.Date AND
        r.currDate < DATEADD(day, 1, A.Date) AND   
        r.currCode = a.currCode
来自#可诱惑的左连接
TBLCurrr
在r.currDate>=A.日期和
r、 currDate

这将允许代码在
tblcurrates(currCode,currDate)
上使用索引。不过,我怀疑您的代码也会使用该索引。

Currencybid是数据类型Money
tblRate.currDate
的数据类型是什么?是不是要去掉时间部分?您可以将连接编写为代码上的equi连接和日期上的范围谓词,如果您有嵌套循环和适当的索引来支持seek,这可能会很有用。否则,强制转换实际上会有帮助,因为对于两个谓词equi join,这对合并或哈希joincurr date有帮助。date的数据类型是datetimeStop,四处飞溅。它们不是没有后果的,只有当你确切地理解它们的作用并且知道它们是需要的时候,你才应该使用它们。否-如果不更改模式,就无法避免转换。没有长度的varchar的转换是草率的。数值的格式设置应该留给数据使用者,而不是查询。