2

次の動的 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

しかし、それは私にこのエラーを与えました

メッセージ 245、レベル 16、状態 1、行 13
varchar 値 ',0) = 0 OR lsmt.ID = ' をデータ型 int に変換するときに変換に失敗しました。

4

3 に答える 3

1

WHERE句を作り直して、コード ブロックの先頭にある変数計算に移動することで、クエリの本文の ISNULLS を削除 できます。

したがって、代わりに:

SET @TypeID = CONVERT(Varchar(10), @MediaTypeID)

行う:

SET @TypeID =  CAST( COALESCE(@MediaTypeID, 0) AS Varchar)

そうすれば、クエリ自体で変換を行う必要はありません。

于 2013-07-20T13:51:19.173 に答える
1

発生しているエラーは、変数 MediaTypeID と MediaGroupID を int から varchar に変換しようとしているためです。その操作は失敗しません。ただ起こらないだけです。問題は、両方ともまだ整数であり、エラーの原因となっている動的コードに追加しようとしていることです。だから私がしたことは、問題を解決するはずの2つの新しい変数を宣言することでした。含めなかったコードを調べると、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
于 2013-07-20T14:00:01.167 に答える