我有一个动态插入程序。实际上我试图用一个带C#的按钮来创建所有程序。无论如何,我创建了插入过程,但如果isActive为null,它看起来像那样。所以sql server出错了。有没有办法替换这个昏迷(,)char?或任何建议?
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;
答案 0 :(得分: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
答案 1 :(得分: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;
答案 2 :(得分: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;
答案 3 :(得分:0)
如果您只想删除尾随字符,可以将其放在脚本中的适当位置:
SET @sqlQuery = LEFT(@sqlQuery, LEN(@sqlquery) - 1)
这将删除尾随空格和之前的最后一个字符。