Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 生成删除查询_Sql_.net_Sql Server - Fatal编程技术网

Sql 生成删除查询

Sql 生成删除查询,sql,.net,sql-server,Sql,.net,Sql Server,我正在尝试编写一个查询,根据需求自动生成删除查询。我将从不同的表中删除数据并转储到临时表中,然后使用这个临时表,我需要使用IN运算符编写查询,请建议我,这是我尝试过的 SET NOCOUNT ON DECLARE @DeleteDisbursement TABLE (DisbursementId BIGINT, PolicyNumber NVARCHAR(10),DisbursementAmount DECIMAL(19,4)) DECLARE @DeleteRecords Table(Dis

我正在尝试编写一个查询,根据需求自动生成删除查询。我将从不同的表中删除数据并转储到临时表中,然后使用这个临时表,我需要使用IN运算符编写查询,请建议我,这是我尝试过的

SET NOCOUNT ON

DECLARE @DeleteDisbursement TABLE (DisbursementId BIGINT, PolicyNumber NVARCHAR(10),DisbursementAmount DECIMAL(19,4))
DECLARE @DeleteRecords Table(DisbursementId BIGINT,ActivityId BIGINT)
INSERT INTO @DeleteDisbursement (DisbursementId,PolicyNumber,DisbursementAmount) 
VALUES 
(4576,'12345',3.00),
(1232,'65455',143.44),
(2341,'34234',228.95),
(1111,'23155',414.89)

SELECT * from @DeleteDisbursement

DECLARE @GenerateScriptCount BIGINT =0
DECLARE @DisbursementIDValue BIGINT =0
DECLARE @ActivityIdValue BIGINT =0

WHILE EXISTS(SELECT Top 1 1 FROM @DeleteDisbursement)
BEGIN
   DECLARE @DisbursementId BIGINT =0
   DECLARE @PolicyNumber NVARCHAR(10)
   DECLARE @AccountId BIGINT =0
   DECLARE @ActivityId BIGINT
   DECLARE @DisbursementAmount DECIMAL(19,4)

SELECT TOP 1 @DisbursementId =DisbursementId ,@PolicyNumber = PolicyNumber,@DisbursementAmount = DisbursementAmount
  FROM @DeleteDisbursement

SET @ActivityId = (SELECT ActivityId FROM ActivityLog WHERE ActivityAmount = @DisbursementAmount)  
  
  IF (@ActivityId > 0)
    BEGIN
      
     INSERT INTO @DeleteRecords (DisbursementId,ActivityId) VALUES(@DisbursementId,@ActivityId)
    
    END
  DELETE FROM @DeleteDisbursement WHERE DisbursementId = @DisbursementId

END
    
    WHILE EXISTS(SELECT Top 1 1 FROM @DeleteRecords)
    BEGIN

        SELECT TOP 1 @DisbursementIDValue= @DisbursementId,@ActivityIdValue = @ActivityId FROM @DeleteRecords 

         PRINT 'DELETE FROM Disbursement Where DisbursementId IN (' + CONVERT(NVARCHAR(MAX), @DisbursementIDValue) +')' 

         PRINT 'DELETE FROM ActivityLog WHERE ActivityId IN (' + CONVERT(NVARCHAR(MAX), @ActivityIdValue) +')'  

        DELETE FROM @DeleteRecords WHERE DisbursementId = @DisbursementId

    END

SET NOCOUNT OFF;
但它不起作用,请帮助我如何编写仅包含在运算符中的1个查询,如下所示:-

DELETE FROM Disbursement Where DisbursementId IN (4576,1232,2341,1111)
DELETE FROM ActivityLog WHERE ActivityId IN (1000,2000,3000,4000)

我知道这并没有回答你的直接问题,但我很肯定这会更快,避免你的任何问题。毫无疑问,您将不得不调整以匹配您的真实版本,但这应该会给出一个想法

begin transaction

delete Disbursement
from DeleteDisbursement dd
join Disbursement on Disbursement.DisbursementId=dd.DisbursementId

delete ActivityLog
from DeleteDisbursement dd
join ActivityLog on ActivityLog.ActivityAmount=dd.DisbursementAmount

commit work

你不需要这么复杂。首先将值存储在临时表中,然后将临时表重新用于delete语句。或者,您可以使用SQL 2017以后支持的字符串_AGG函数生成id列表

声明@sqlStmt NVARCHARMAX='0 创建表DeletePaymentation PaymentId BIGINT,保单编号NVARCHAR10,支付金额小数19,4 创建表deleteID BIGINT,ActivityId BIGINT 插入DeletePaymentation PaymentId、保单编号、支付金额 价值观 4576,'12345',3.00, 1232,'65455',143.44, 2341,'34234',228.95, 1111,'23155',414.89 插入DeleteRecords的付款ID、活动ID 从ActivityLog中选择PaymentId、ActivityId作为al 内部连接删除作为dd 付款日金额=所有活动金额 ' 方法1使用Id列表的临时表 设置@sqlStmt+=' 从支出中删除,其中选择支出ID 删除记录中的付款ID 从ActivityLog中删除,其中ActivityId位于SELECT中 DeleteRecords中的ActivityId' 打印@sqlStmt 方法2使用STRING_AGG生成Id列表 设置@sqlStmt+=' 从放款中删除,其中放款ID位于“+选择字符串”\u aggdemploymentID“,“从DeleteRecords+”;“+CHAR13+CHAR10+“开始”+CHAR13+CHAR10+ '从ActivityLog中删除,其中ActivityId位于'+选择 DeleteRecords+;+中的字符串_AGGActivityId','CHAR13+CHAR10+“开始” 打印@sqlstmt
您是否有理由逐行执行此操作,而不是只执行一条语句?有点不清楚你的@tables是否只是为了演示,或者它们是否是你实际工作中的硬表。我想我正在努力实现-我创建了临时表,在该表中我插入了所有我想删除的记录,根据输入值输入可能是1000条或更多记录。现在使用这个临时表,我必须使用IN运算符动态生成Delete查询,比如从表1中的Delete*,其中disbId为1,2,3,4,5,6等,直到1000行,这基本上是为了性能目的,我可以从表1中的disbId=1使用=like Delete*,从表1中的disbId=2等实现Delete*,但是它在产品中需要很长时间,所以我必须实现仅在中使用,因为我的查询将只执行打印操作,所以我将手动复制打印生成的查询,并将其放置到生产中进行删除。请建议我如何使用我的上述条件进行打印,我需要打印所有需要在操作员中删除的值,如打印“从放款中删除,其中放款ID在放款IDValue中”谢谢Tom,基本上我的要求不是像这样直接删除,我需要打印动态生成的查询,如-PRINT“DELETE FROM payment Where paymentId IN paymentIDValue”,此处paymentIDValue可能类似于1,2,3,4,5等。。它应该是动态生成的,我不知道该怎么做谢谢venkat的回复,我尝试了你的方法它对我不起作用,因为在我的情况下,我必须使用while语句循环插入@DeleteRecords表,因为我将根据上面查询中显示的不同条件获取ActivityId。我试着在没有打印的情况下在里面添加your approach 1