0

表示するデータを選択するためにグリッドビューで使用されているクエリを使用しています。

SELECT [Theme].[PK_Theme], [Theme].[Name], [ThemeType].[Type] 
FROM [Theme] 
LEFT OUTER JOIN [ThemeType] 
ON [Theme].[ThemeTypeId] = [ThemeType].[PK_ThemeType] 
JOIN [ProductTheme] ON [ProductTheme].[ThemeId]=[Theme].[PK_Theme] 
WHERE ProductTheme.ProductID LIKE @productParam 
AND ProductTheme.ThemeId = Theme.PK_Theme 
AND COALESCE([THEME].[THEMETYPEID], 'null') LIKE @assignedParam 
GROUP BY [Theme].[Name], [ThemeType].[Type], [Theme].[PK_Theme] 
ORDER BY CASE WHEN [ThemeType].[Type] IS NULL THEN 0 ELSE 1 END, [Theme].[Name]

列 [THEME].[THEMETYPEID] は以前は varchar(50) でしたが、int に変更されました。

私は今、このエラーが発生しています:

Conversion failed when converting the varchar value 'NULL' to data type int.

奇妙なことの1つは、上記のステートメントが機能するサーバーに直接クエリを実行することです(値のパラメーターを変更します)が、サーバーコントロールでは機能しません。

更新された列では、NULL が許可されます。この状況で int の Null をチェックし、クエリを以前と同じように機能させるにはどうすればよいですか?

編集両方のパラメーターに「%」が割り当てられている場合、結果は次のようになります。

ここに画像の説明を入力

4

2 に答える 2

3

この行:

AND COALESCE([THEME].[THEMETYPEID], 'null') LIKE @assignedParam 

する必要があります (一重引用符なし):

AND COALESCE([THEME].[THEMETYPEID], NULL) LIKE @assignedParam 

おそらく値'null'を意味するつもりですが、通常の文字列だからですNULL

または、次のように変更する必要があります。

AND COALESCE([THEME].[THEMETYPEID], 0) LIKE @assignedParam 

ThemeTyeID は int なので 

アップデート:

これを試して:

 SELECT  [Theme].[PK_Theme] ,
                [Theme].[Name] ,
                [ThemeType].[Type]
        FROM    [Theme]
                LEFT OUTER JOIN [ThemeType] ON [Theme].[ThemeTypeId] = [ThemeType].[PK_ThemeType]
                JOIN [ProductTheme] ON [ProductTheme].[ThemeId] = [Theme].[PK_Theme]
        WHERE   ProductTheme.ProductID LIKE @productParam
                AND ProductTheme.ThemeId = Theme.PK_Theme
                AND 1 = CASE WHEN [THEME].[THEMETYPEID] IS NULL THEN 1
                             WHEN [THEME].[THEMETYPEID] LIKE @param THEN 1
                        END
        GROUP BY [Theme].[Name] ,
                [ThemeType].[Type] ,
                [Theme].[PK_Theme]
        ORDER BY CASE WHEN [ThemeType].[Type] IS NULL THEN 0
                      ELSE 1
                 END ,
                [Theme].[Name]

ただし、これが希望どおりに機能する場合、ケースごとに個別のクエリを作成するほど効率的ではないことを警告しました。そしておそらくそれらを結合します...

于 2013-08-02T13:24:45.330 に答える
0

次のコードを試してください:

SELECT [Theme].[PK_Theme], [Theme].[Name], [ThemeType].[Type] 
FROM [Theme] 
LEFT OUTER JOIN [ThemeType] 
ON [Theme].[ThemeTypeId] = [ThemeType].[PK_ThemeType] 
JOIN [ProductTheme] ON [ProductTheme].[ThemeId]=[Theme].[PK_Theme] 
WHERE ProductTheme.ProductID LIKE @productParam 
AND ProductTheme.ThemeId = Theme.PK_Theme AND [Theme].[ThemeTypeId] IS NOT NULL 
AND COALESCE([THEME].[THEMETYPEID], 'null') LIKE @assignedParam 
GROUP BY [Theme].[Name], [ThemeType].[Type], [Theme].[PK_Theme] 
ORDER BY CASE WHEN [ThemeType].[Type] IS NULL THEN 0 ELSE 1 END, [Theme].[Name]
于 2013-08-02T13:21:51.797 に答える