0

動的挿入手順があります。実際には、C# を使用して 1 つのボタンですべてのプロシージャを作成しようとしています。とにかく、私はその挿入手順を作成しましたが、isActive が null の場合、そのように見えます。したがって、SQLサーバーはエラーを出します。このコマ(,)文字を置き換える方法はありますか? または何か提案はありますか?

INSERT INTO category (  mainCatId,  catname, isActive, ) VALUES (  @mainCatId,  @catname, @isActive,  )

そのように見えます。

declare @mainCatId int = 1, @catname nvarchar (50) = NULL, @isActive bit = NULL

DECLARE @sqlQuery nvarchar(4000); 
SET @sqlQuery =     'INSERT INTO category ( ';

IF ( @mainCatId IS NOT NULL )
 SET @sqlQuery = @sqlQuery + ' mainCatId, ';

IF ( @isActive IS NOT NULL )
 SET @sqlQuery = @sqlQuery + ' isActive, ';

SET @sqlQuery = @sqlQuery + ' )';

SET @sqlQuery = @sqlQuery + ' VALUES ( ';

IF ( @mainCatId IS NOT NULL )
 SET @sqlQuery = @sqlQuery + ' @mainCatId, ';

IF ( @catname IS NOT NULL )
 SET @sqlQuery = @sqlQuery + ' @catname, ';

IF ( @isActive IS NOT NULL )
 SET @sqlQuery = @sqlQuery + ' @isActive, ';

SET @sqlQuery = @sqlQuery + ' )';
SET @sqlQuery = @sqlQuery;
4

4 に答える 4

3

私はこれを少し違う方法で行います。各値の文字列を作成する代わりに、これには完全な SQL ステートメントがあり、各フィールドの値を渡すだけです。:

declare @mainCatId int = 1, 
    @catname nvarchar (50) = NULL, 
    @isActive bit = NULL

declare @mainCatIdString nvarchar(10)
declare @catnameString nvarchar(50)
declare @isActiveString nvarchar(50) 

DECLARE @sqlQuery nvarchar(4000); 


If @mainCatId is not null
    set @mainCatIdString = cast(@mainCatId as nvarchar(10))
else 
    set @mainCatIdString = ''

If @catname is not null
    set @catnameString = @catname
else 
    set @catnameString = ''

If @isActive is not null
    set @isActiveString = Cast(@isActive as nvarchar(10))
else 
    set @isActiveString = 0

SET @sqlQuery = 'INSERT INTO category 
                (
                    mainCatId, 
                    catname, 
                    isActive
                ) 
                VALUES 
                (
                    ' + @mainCatIdString +',''' 
                        + @catnameString + ''',' 
                        + @isActiveString +')'
 print @sqlQuery

編集:これに動的クエリを使用する理由が完全にはわかりません。これは、これと同様のストアド プロシージャで簡単に実行できます。この手順では、3 つのパラメーターすべてをそれに渡し、値が次のようになっているかどうかに基づいて値を評価しますnull

create procedure test
(
    @mainCatId int = 1, 
    @catname nvarchar (50) = null, 
    @isActive bit = null
)
AS
BEGIN                               
   INSERT INTO Category
   (
       mainCatId, 
       catname, 
       isActive
   ) 
   SELECT IsNull(@mainCatId, 1), 
      IsNull(@catname, ''), 
      IsNull(@isActive, 0)
END
于 2012-08-23T19:29:39.470 に答える
1

なぜわざわざ動的 SQL を使用し、このクエリを動的に作成して、NULL 値を持つ列を除外するのですか? これらの列が null 可能で、 を格納したい場合は、次のように言ってNULLみませんか。

INSERT dbo.category(mainCatId,catname,isActive) 
  VALUES(@mainCatId,@catname,@isActive);

これにより、パラメーターが NULL である列に NULL 値が入れられます。それらが NOT NULL として指定されているか、デフォルトがある場合は、動的 SQL をより簡単に作成できます。

declare @mainCatId int = 1, @catname nvarchar (50) = NULL, @isActive bit = NULL

DECLARE @sql NVARCHAR(4000);

SELECT @sql = N'';

SET @sql = N'INSERT dbo.category(mainCatId,catname,isActive) 
  VALUES(' + COALESCE(RTRIM(@mainCatId), 'DEFAULT')
   + ',' + COALESCE(N'''' 
   + REPLACE(@catname, '''', '''''') + '''', 'DEFAULT')
   + ',' + COALESCE(RTRIM(@isActive), 'DEFAULT')
   + ');';

EXEC sp_executesql @sql;
于 2012-08-23T20:44:29.240 に答える
0

末尾の文字を削除したいだけの場合は、これをスクリプトの適切な場所に配置できます。

SET @sqlQuery = LEFT(@sqlQuery, LEN(@sqlquery) - 1)

これにより、末尾のスペースとその前の最後の文字が削除されます。

于 2012-08-23T19:27:34.660 に答える
0

正確な質問はわかりませんが、コンマを移動するだけで、末尾のコンマの問題は発生しません:

また、値の引用符を追加しました(動的ステートメントの実行方法によっては、再度2倍にする必要がある場合があります)

declare @mainCatId int = 1, @catname nvarchar (50) = NULL, @isActive bit = NULL

DECLARE @sqlQuery nvarchar(4000); 
SET @sqlQuery =     'INSERT INTO category ( ';

IF ( @mainCatId IS NOT NULL )
 SET @sqlQuery = @sqlQuery + 'mainCatId';

IF ( @catname IS NOT NULL )
 SET @sqlQuery = @sqlQuery + ',catname ';

IF ( @isActive IS NOT NULL )
 SET @sqlQuery = @sqlQuery + ',isActive ';

SET @sqlQuery = @sqlQuery + ' )';

SET @sqlQuery = @sqlQuery + ' VALUES ( ';

IF ( @mainCatId IS NOT NULL )
 SET @sqlQuery = @sqlQuery + ' '''+@mainCatId+''' ';

IF ( @catname IS NOT NULL )
 SET @sqlQuery = @sqlQuery + ' ,'''+@catname+''' ';

IF ( @isActive IS NOT NULL )
 SET @sqlQuery = @sqlQuery + ' ,'''+@isActive+''' ';

SET @sqlQuery = @sqlQuery + ' )';
SET @sqlQuery = @sqlQuery;
于 2012-08-23T19:21:03.280 に答える