MSSQL如何仅当INSERT语句VALUES内所有值非空时执行插入
问题解答
你自行编写的SQL存在的语法问题
DECLARE语句必须指定变量的数据类型,需和tblAssets.AssetID的字段类型匹配,一般为INT- 用
SET给变量赋值嵌套SELECT语句时,需要把SELECT语句用括号包裹,或者直接用SELECT语法赋值更简洁 - 如果
AssetName是字符串类型,查询条件里的$field1、$field2需要用引号包裹,否则会触发语法错误
修正后的可运行方案(变量判断版)
-- 声明变量,类型和AssetID保持一致即可 DECLARE @ParentID INT, @ChildID INT -- 赋值查询 SELECT @ParentID = AssetID FROM tblAssets WHERE AssetName = N'$field2' SELECT @ChildID = AssetID FROM tblAssets WHERE AssetName = N'$field1' -- 两个都非空才执行插入 IF @ParentID IS NOT NULL AND @ChildID IS NOT NULL BEGIN INSERT INTO tblAssetRelations (ParentAssetID, ChildAssetID, Type) VALUES (@ParentID, @ChildID, 12) END
更简洁的无变量方案(推荐)
不需要声明变量和单独判断,直接用INSERT ... SELECT语法即可自动实现"无匹配则不插入"的逻辑:
INSERT INTO tblAssetRelations (ParentAssetID, ChildAssetID, Type) SELECT parent.AssetID, child.AssetID, 12 FROM tblAssets parent CROSS JOIN tblAssets child WHERE parent.AssetName = N'$field2' AND child.AssetName = N'$field1'
只要任意一个AssetName查询不到匹配的行,整个SELECT语句就会返回0条结果,INSERT操作自然不会执行,完全满足你的需求。
PowerShell调用注意事项
建议不要直接拼接SQL字符串,改用参数化查询传递$field1和$field2的值,避免SQL注入风险和特殊字符导致的语法错误。
内容的提问来源于stack exchange,提问作者modi
相关产品推荐
相关产品推荐

