1

ストアドプロシージャがあります。このストアド プロシージャでは、特定のパラメーターが null でないことを確認する必要があります。これどうやってするの?私はこれを書きました:

ALTER PROCEDURE [dbo].[GetReelListings]
    @locationUrlIdentifier VARCHAR(100)
AS
BEGIN   

SET NOCOUNT ON;

declare @Sql varchar(max)=''

SET @Sql = 'SELECT CategoryName, CategoryUrlIdentifier,  LocationUrlIdentifier, Directory.* FROM (SELECT ROW_NUMBER() OVER (PARTITION BY Category.Name ORDER BY CASE WHEN '''+ @locationUrlIdentifier + ''' = Location.UrlIdentifier THEN 1 ELSE CASE WHEN ''' + @locationUrlIdentifier + ''' IS NULL AND Directory.LocationId IS NULL THEN 0 ELSE 2 END END, Directory.SortOrder ) AS ''RowNo'', Category.Name AS CategoryName, Category.UrlIdentifier AS CategoryUrlIdentifier, dbo.Location.UrlIdentifier AS LocationUrlIdentifier, Directory.DirectoryId, CASE WHEN ''' + @locationUrlIdentifier + ''' = Location.UrlIdentifier THEN 1 ELSE CASE WHEN ''' + @locationUrlIdentifier + ''' IS NULL AND Directory.LocationId IS NULL THEN 0 ELSE 2 END END AS CategoryOrder    FROM dbo.Directory  INNER JOIN dbo.Category ON Directory.CategoryId = Category.CategoryId LEFT OUTER JOIN dbo.Location ON dbo.Directory.LocationId = location.Location_ID ) AS content INNER JOIN dbo.Directory ON content.DirectoryId = Directory.DirectoryId WHERE content.RowNo =1 '

if (@locationUrlIdentifier is null)
begin
SET @Sql = @Sql + ' and 1=1'
end
else
begin
SET @Sql = @Sql + ' and CategoryOrder = 1 '
end

print @SQl
EXECUTE (@Sql)
 END

これは SQL では機能しますが、Codebehind では null データセットを返します。

4

4 に答える 4

3

文字列と を結合するとNULL、結果は になりNULLます。変数が であるかどうかを尋ねているときにはNULL、すでにこれを行っています。

' + @locationUrlIdentifier + '

数回。ならNULLそう@Sqlなる。

を使用して、を適切な置換 (空の文字列など)COALESCEに置き換えることを検討することをお勧めします。NULL

' + COALESCE(@locationUrlIdentifier,'') + '

また、最終的な構築にはまだ論理エラーがあります。変数が の場合、次のNULLように where 句があります。

WHERE content.RowNo =1 1=1

これは有効ではありません。何も追加する必要はないと思います。


また、なぜこれを動的 SQL として実行しているのかについても明確ではありません。以下は、直接実行できる同等のクエリのようです。

SELECT
    CategoryName,
    CategoryUrlIdentifier,
    LocationUrlIdentifier,
    Directory.*
FROM
    (SELECT
        ROW_NUMBER() OVER (
            PARTITION BY Category.Name ORDER BY
                CASE
                    WHEN @locationUrlIdentifier  = Location.UrlIdentifier THEN 1
                    WHEN @locationUrlIdentifier IS NULL AND Directory.LocationId IS NULL THEN 0
                    ELSE 2
                END,
                Directory.SortOrder
        ) AS RowNo,
        Category.Name AS CategoryName,
        Category.UrlIdentifier AS CategoryUrlIdentifier,
        dbo.Location.UrlIdentifier AS LocationUrlIdentifier,
        Directory.DirectoryId,
        CASE
            WHEN @locationUrlIdentifier  = Location.UrlIdentifier THEN 1
            WHEN @locationUrlIdentifier IS NULL AND Directory.LocationId IS NULL THEN 0
            ELSE 2
        END AS CategoryOrder
    FROM
        dbo.Directory
            INNER JOIN
        dbo.Category
            ON
                Directory.CategoryId = Category.CategoryId
            LEFT OUTER JOIN
        dbo.Location
            ON
                dbo.Directory.LocationId = location.Location_ID
    ) AS content
        INNER JOIN
    dbo.Directory
        ON
            content.DirectoryId = Directory.DirectoryId
WHERE
    content.RowNo =1 and
    (@locationUrlIdentifier or CategoryOrder = 1)
于 2012-09-19T12:48:30.330 に答える
1

1 つのクエリで実行できます。

Select Query ...where ... 
  and ((@locationUrlIdentifier is null) or (CategoryOrder = 1))
于 2012-09-19T12:48:07.443 に答える
0

IS NULL の代わりに NULLIF を使用できます

参照:ストアド プロシージャでパラメータが null または空であるかどうかを確認します

http://msdn.microsoft.com/en-us/library/ms177562.aspx

于 2012-09-19T12:50:56.460 に答える
0

または、 ISNULL()チェックを使用してから、null を空の文字列に変更することもできます

IF (ISNULL(@locationUrlIdentifier,'') = '')

または、このチェックの前でも、問題が解決しない場合は、から空の文字列ISNULL()に変換するために使用できますNULL

于 2012-09-19T12:54:32.450 に答える