首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在sql中管理与c#更改相关的for循环?有超过4个修饰符需要添加到我们的列表中

在sql中管理与c#更改相关的for循环?有超过4个修饰符需要添加到我们的列表中
EN

Stack Overflow用户
提问于 2018-03-20 04:33:05
回答 2查看 47关注 0票数 0

我有C#和SQL代码可以协同工作。问题是我需要在我的列表中添加4个以上的修饰符,但这是不可能的,所以我更改了c#代码并与之相关,我需要更改我的SQL代码。我不知道如何在SQL中放入for循环。请帮帮我。

我有一个表,我需要在上面添加"n“修饰符。

下面是我修改过的c#代码:

代码语言:javascript
复制
int n = updatedStudy.Modifiers.Count;

for (int i = 1; i < n; i++)
{
    string @pu_examCodeModifier = "@pu_examCodeModifier" + i;
    sqlParm.Add(@pu_examCodeModifier, updatedStudy.Modifiers[i - 1].Key, SQLEnumerations.SQLDataTypes.UNIQUEIDENTIFIER, 0);
}

下面是我需要修改的SQL代码:

代码语言:javascript
复制
CREATE PROCEDURE [v0000].[apUpdateOrder] (
    @pu_fillerOrderKey UNIQUEIDENTIFIER,
    @pu_examCodeKey UNIQUEIDENTIFIER,
    @pu_examCodeModifier1 UNIQUEIDENTIFIER = NULL ,
    @pu_examCodeModifier2 UNIQUEIDENTIFIER = NULL,
    @pu_examCodeModifier3 UNIQUEIDENTIFIER = NULL,
    @pu_examCodeModifier4 UNIQUEIDENTIFIER = NULL,
    @ps_fillerOrderStatusCd VARCHAR(1),
    @ps_priorityCd VARCHAR(10),
    @pb_exam_stat_flag BIT)
AS
BEGIN
    --exam code modifiers
    IF (@pb_updateStudyModifiers IS NOT NULL)
    BEGIN
        DELETE FROM dbo.mapProcedureStepExamCodeModifier 
        WHERE procedureStepKey = @lu_procedureStepKey

        IF (@pu_examCodeModifier1 IS NOT NULL)
           INSERT INTO dbo.mapProcedureStepExamCodeModifier (procedureStepKey, examCodeModifierKey)
           VALUES (@lu_procedureStepKey, @pu_examCodeModifier1)

        IF (@pu_examCodeModifier2 IS NOT NULL)
           INSERT INTO dbo.mapProcedureStepExamCodeModifier (procedureStepKey, examCodeModifierKey)
           VALUES (@lu_procedureStepKey, @pu_examCodeModifier2)

        IF (@pu_examCodeModifier3 IS NOT NULL)
           INSERT INTO dbo.mapProcedureStepExamCodeModifier (procedureStepKey, examCodeModifierKey)
           VALUES (@lu_procedureStepKey, @pu_examCodeModifier3)

        IF (@pu_examCodeModifier4 IS NOT NULL)
           INSERT INTO dbo.mapProcedureStepExamCodeModifier (procedureStepKey, examCodeModifierKey)
           VALUES (@lu_procedureStepKey, @pu_examCodeModifier4)   
   END
EN

回答 2

Stack Overflow用户

发布于 2018-03-20 04:47:16

将循环放到DB端通常是可取的。将这类工作放到客户端只会更慢,并且容易出现竞争条件。

在我阅读它时,您希望在删除该行时对该行以前的值做出反应。有几种方法可以做到这一点:

删除触发器。特别是如果这不仅仅是一次重新构造,并且表将保留不变,我会选择DML triggers。它仍然是原始DML订单事务和锁定的一部分,因此它几乎没有竞争条件的危险。

输出语法。通常需要从您刚刚插入、更新或删除的行中获取数据。OUTPUT clause已经为你准备好了。同样,这也是原始DML事务的一部分。此外,它还可以访问刚刚创建的自动值(如主键)。

的核心SQL循环是更通用的while。诀窍是创建一个存储过程,这个存储过程基本上是一个数组,你可以在其中提交像Table Valued Paramter这样的东西。或者将主键提取到局部变量本身中。

如果需要索引或任何其他临时变量,只需自己创建一个即可。这就是DECLARE的作用所在。

关于循环修改,值得考虑的一件事是事务和锁定。默认情况下,每个单独的DML statemetn将被包装到一个单独的事务中,并获得单独的锁定。这可能会增加大量的开销。因此,自己创建事务和锁可能是有益的--只需记住立即锁定您可能需要的所有表。

票数 0
EN

Stack Overflow用户

发布于 2018-03-20 05:03:55

关于你提供的例子,有一些问题,比如@pb_updateStudyModifiers和@lu_procedureStepKey是从哪里来的。

关于如何在SQL中循环的具体问题,答案是:

如果您已经知道这些值,并且它们是数值,请使用-If:

代码语言:javascript
复制
DECLARE @ID INT = 0

WHILE @ID < 3
BEGIN
    SELECT @ID = @ID + 1
    SELECT 'The current ID is: ' + CAST(@ID AS VARCHAR)
END

-If如果您需要遍历其他值类型,则需要一个辅助表和一个游标。这是一个如何遍历一个表的示例(执行与上面相同的操作,只使用INT变量):

代码语言:javascript
复制
DECLARE @EXAMPLE_IDS TABLE (
    ID INT
)
-- POPULATE THE EXAMPLE TABLE
INSERT INTO @EXAMPLE_IDS VALUES ( 1 )
INSERT INTO @EXAMPLE_IDS VALUES ( 2 )
INSERT INTO @EXAMPLE_IDS VALUES ( 3 )


DECLARE EXAMPLE_CURSOR CURSOR FOR SELECT ID FROM @EXAMPLE_IDS

DECLARE @CURRENT_ID INT

OPEN EXAMPLE_CURSOR

-- GET FIRST ELEMENT
FETCH NEXT FROM EXAMPLE_CURSOR INTO @CURRENT_ID

-- THIS IS YOUR LOOP
WHILE @@FETCH_STATUS = 0
BEGIN
    -- DO YOUR STUFF HERE 
    SELECT 'The current ID is: ' + CAST(@CURRENT_ID AS VARCHAR)
    -- GET NEXT ID
    FETCH NEXT FROM EXAMPLE_CURSOR INTO @CURRENT_ID
END

CLOSE EXAMPLE_CURSOR
DEALLOCATE EXAMPLE_CURSOR
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49371918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档