sql - 最小化动态sql中的函数调用?

标签 sql sql-server t-sql

如何摆脱以下动态 SQL 中的多个转换函数?

IF @MediaTypeID > 0 or @MediaGroupID > 0
BEGIN
    SET @SQL = @SQL + 'INNER JOIN (SELECT lmc.ID FROM Lookup_MediaChannels (nolock) lmc 
                       INNER JOIN Lookup_SonarMediaTypes (nolock) lsmt ON lmc.SonarMediaTypeID = lsmt.ID
                       WHERE (ISNULL('+ CONVERT(VARCHAR(10),@MediaTypeID) +',0) = 0 OR lsmt.ID = '+ CONVERT(VARCHAR(10),@MediaTypeID) +') 
                         AND (ISNULL('+ CONVERT(VARCHAR(10),@MediaGroupID)+',0) = 0 OR lsmt.SonarMediaGroupID = '+ CONVERT(VARCHAR(10),@MediaGroupID) +'))t ON t.ID = lmc.ID '

我尝试先转换它们并使用变量而不是像下面这样的转换调用

IF @MediaTypeID > 0 or @MediaGroupID > 0
       BEGIN
       SET @TypeID = CONVERT(VARCHAR(10),@MediaTypeID)
       SET @GroupID = CONVERT(VARCHAR(10),@MediaGroupID)
          SET @SQL = @SQL + 'INNER JOIN (SELECT lmc.ID FROM Lookup_MediaChannels (nolock) lmc 
                                   INNER JOIN Lookup_SonarMediaTypes (nolock) lsmt ON lmc.SonarMediaTypeID = lsmt.ID
                                   WHERE (ISNULL('+ @TypeID +',0) = 0 OR lsmt.ID = '+ @TypeID +') 
                                   AND (ISNULL('+ @GroupID+',0) = 0 OR lsmt.SonarMediaGroupID = '+ @GroupID +'))'
       END

但它给了我这个错误

Msg 245, Level 16, State 1, Line 13
Conversion failed when converting the varchar value ',0) = 0 OR lsmt.ID = ' to data type int.

最佳答案

您收到的错误是因为您尝试将变量 MediaTypeID 和 MediaGroupID 从 int 转换为 varchar。该操作不会失败,只是不会发生。问题是两者仍然是整数,您试图将其添加到导致错误的动态代码中。所以我所做的就是声明两个新变量,这应该可以解决问题。如果您查看未包含的代码,您应该注意到 MediaTypeID 和 MediaGroupID 都是最有可能的整数。

IF @MediaTypeID > 0 or @MediaGroupID > 0
BEGIN
DECLARE @TypeID2 VARCHAR(10)
DECLARE @GroupID2 VARCHAR(10)

SET @TypeID2 =  NULLIF(CONVERT(VARCHAR(10),@MediaTypeID ), 0)
SET @GroupID2 = NULLIF(CONVERT(VARCHAR(10),@MediaGroupID), 0)
SET @SQL = @SQL + 'INNER JOIN (SELECT lmc.ID FROM Lookup_MediaChannels (nolock) lmc 
                   INNER JOIN Lookup_SonarMediaTypes (nolock) lsmt ON lmc.SonarMediaTypeID = lsmt.ID
  WHERE '+ 
  coalesce( @TypeID2 +' = lsmt.ID', '1=1') +
  coalesce( 'AND' + @GroupID2+' = lsmt.SonarMediaGroupID', '') + ')t ON t.ID = lmc.ID '
END

关于sql - 最小化动态sql中的函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17762854/

相关文章:

c# - C#如何获取员工的总休假数

sql - 禁止基于 WHERE 子句的 SELECT 输出

sql - 如何在 Oracle 查询中的两个给定日期之间选择日期?

sql - 如何选择多列同时保持其中一列不同

mysql - 如何修复 MySQL 中的外键错误?

sql - 在更新语法中对子查询使用内部联接

mysql - 使用内部联接实现联合所有查询

sql - 波斯语全文索引停止列表

SQL Server 创建动态列 Login1、Login2、Login3

sql - 从 sql 查询中排除所有结果的有效方法是什么?