我有C#和SQL代码可以协同工作。问题是我需要在我的列表中添加4个以上的修饰符,但这是不可能的,所以我更改了c#代码并与之相关,我需要更改我的SQL代码。我不知道如何在SQL中放入for循环。请帮帮我。
我有一个表,我需要在上面添加"n“修饰符。
下面是我修改过的c#代码:
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代码:
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发布于 2018-03-20 04:47:16
将循环放到DB端通常是可取的。将这类工作放到客户端只会更慢,并且容易出现竞争条件。
在我阅读它时,您希望在删除该行时对该行以前的值做出反应。有几种方法可以做到这一点:
删除触发器。特别是如果这不仅仅是一次重新构造,并且表将保留不变,我会选择DML triggers。它仍然是原始DML订单事务和锁定的一部分,因此它几乎没有竞争条件的危险。
输出语法。通常需要从您刚刚插入、更新或删除的行中获取数据。OUTPUT clause已经为你准备好了。同样,这也是原始DML事务的一部分。此外,它还可以访问刚刚创建的自动值(如主键)。
的核心SQL循环是更通用的while。诀窍是创建一个存储过程,这个存储过程基本上是一个数组,你可以在其中提交像Table Valued Paramter这样的东西。或者将主键提取到局部变量本身中。
如果需要索引或任何其他临时变量,只需自己创建一个即可。这就是DECLARE的作用所在。
关于循环修改,值得考虑的一件事是事务和锁定。默认情况下,每个单独的DML statemetn将被包装到一个单独的事务中,并获得单独的锁定。这可能会增加大量的开销。因此,自己创建事务和锁可能是有益的--只需记住立即锁定您可能需要的所有表。
发布于 2018-03-20 05:03:55
关于你提供的例子,有一些问题,比如@pb_updateStudyModifiers和@lu_procedureStepKey是从哪里来的。
关于如何在SQL中循环的具体问题,答案是:
如果您已经知道这些值,并且它们是数值,请使用-If:
DECLARE @ID INT = 0
WHILE @ID < 3
BEGIN
SELECT @ID = @ID + 1
SELECT 'The current ID is: ' + CAST(@ID AS VARCHAR)
END-If如果您需要遍历其他值类型,则需要一个辅助表和一个游标。这是一个如何遍历一个表的示例(执行与上面相同的操作,只使用INT变量):
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_CURSORhttps://stackoverflow.com/questions/49371918
复制相似问题