0

我有一个动态插入过程。实际上我试图用 C# 的一个按钮创建所有程序。无论如何,我创建了那个插入过程,但如果 isActive 为空,它看起来像那样。所以sql server报错。有没有办法替换这个 coma(,) 字符?或者有什么建议?

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

编辑:我不完全明白为此使用动态查询的原因。这可以很容易地在与此类似的存储过程中执行。在此过程中,您会将所有三个参数传递给它,然后根据它们是否为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,为什么不直接说:

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

不确定您的确切问题,但如果您只是移动逗号,则不会出现尾随逗号问题:

我还为您的值添加了引号(可能需要再次加倍,具体取决于您的动态语句的执行方式)

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 回答
0

如果您只想去除尾随字符,可以将其放在脚本中的适当位置:

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

这将删除尾随空格和之前的最后一个字符。

于 2012-08-23T19:27:34.660 回答