احصل على إدراج SQL للعمل عند تزويد PK أو لا
-
28-09-2019 - |
سؤال
لدي الإجراء المخزن التالي:
ALTER Procedure dbo.APPL_ServerEnvironmentInsert
(
@ServerEnvironmentName varchar(50),
@ServerEnvironmentDescription varchar(1000),
@UserCreatedId uniqueidentifier,
@ServerEnvironmentId uniqueidentifier OUTPUT
)
WITH RECOMPILE
AS
-- Stores the ServerEnvironmentId.
DECLARE @APPL_ServerEnvironment TABLE (ServerEnvironmentId uniqueidentifier)
-- Insert the data into the table.
INSERT INTO APPL_ServerEnvironment WITH(TABLOCKX)
(
ServerEnvironmentName,
ServerEnvironmentDescription,
DateCreated,
UserCreatedId
)
OUTPUT Inserted.ServerEnvironmentId INTO @APPL_ServerEnvironment
VALUES
(
@ServerEnvironmentName,
@ServerEnvironmentDescription,
GETDATE(),
@UserCreatedId
)
-- If @ServerEnvironmentId was not supplied.
IF (@ServerEnvironmentId IS NULL)
BEGIN
-- Get the ServerEnvironmentId.
SELECT @ServerEnvironmentId = ServerEnvironmentId
FROM @APPL_ServerEnvironment
END
عمود ServerenVironmentID هو مفتاح أساسي مع مجموعة افتراضية عليه ، وهو (newSequentialId ()).
أحتاج إلى هذا الإجراء المخزن للعمل في سيناريوهات 2:
- القيمة المقدمة لـ ServerenVironmentID - الأعمال.
- القيمة غير المقدمة لـ ServerenVironmentId - لا تعمل - لا يمكن إدراج قيمة فارغة. فكرت من خلال تعيين افتراضي على هذا العمود سيكون هذا على ما يرام.
شخص ما ، الرجاء المساعدة في عقل هذا الإجراء حتى يعمل في كلا السيناريوهين. يجب أن يكون للحل الحد الأدنى من التغييرات لأن جميع SP تتبع هذا الاتجاه حاليًا.
نصائح أخرى
يتم تطبيق القيم الافتراضية فقط على إدراج إذا لم يتم تضمين العمود في قائمة الإدراج. أوصي بما يلي غير تافهة تمامًا (لقد علقت الخطوط المراد إزالتها):
ALTER Procedure dbo.APPL_ServerEnvironmentInsert
(
@ServerEnvironmentName varchar(50),
@ServerEnvironmentDescription varchar(1000),
@UserCreatedId uniqueidentifier,
@ServerEnvironmentId uniqueidentifier OUTPUT
)
WITH RECOMPILE
AS
---- Stores the ServerEnvironmentId.
--DECLARE @APPL_ServerEnvironment TABLE (ServerEnvironmentId uniqueidentifier)
IF @ServerEnvironmentName is null
SET @ServerEnvironmentName = newid()
-- Insert the data into the table.
INSERT INTO APPL_ServerEnvironment WITH(TABLOCKX)
(
ServerEnvironmentName,
ServerEnvironmentDescription,
DateCreated,
UserCreatedId
)
--OUTPUT Inserted.ServerEnvironmentId INTO @APPL_ServerEnvironment
VALUES
(
@ServerEnvironmentName,
@ServerEnvironmentDescription,
GETDATE(),
@UserCreatedId
)
---- If @ServerEnvironmentId was not supplied.
--IF (@ServerEnvironmentId IS NULL)
--BEGIN
-- -- Get the ServerEnvironmentId.
-- SELECT @ServerEnvironmentId = ServerEnvironmentId
-- FROM @APPL_ServerEnvironment
--END
لن يتم استخدام القيد الافتراضي بواسطة هذا الإجراء ، ولكن يمكنك تركه في مكانه إذا كانت هناك أماكن أخرى يمكن إضافة صفوف إلى الجدول.
(كانت إجابتي الأولى طويلة وهكذا هذا واحد ، لذلك أنا أنشر إجابة ثانية.)
فاتني أنك كنت تستخدم newSequentialId. مرة أخرى ، إذا تم تحديد عمود ضمن عبارة INSERT ، فلن يتم استخدام أي قيم افتراضية مخصصة لهذا العمود [ما لم تكن تستخدم الكلمة الرئيسية الافتراضية في عبارة إدراج ، لكن هذا لا يزال كل شيء أو لا شيء-لا يمكنك أن تقول "إذا كان Var خاليًا ثم افتراضي". أعتقد أنك عالق مع رمز متفرع وشبه عنيد ، على غرار:
ALTER Procedure dbo.APPL_ServerEnvironmentInsert
(
@ServerEnvironmentName varchar(50),
@ServerEnvironmentDescription varchar(1000),
@UserCreatedId uniqueidentifier,
@ServerEnvironmentId uniqueidentifier OUTPUT
)
WITH RECOMPILE
AS
-- Stores the ServerEnvironmentId.
DECLARE @APPL_ServerEnvironment TABLE (ServerEnvironmentId uniqueidentifier)
IF @ServerEnvironmentId is null
BEGIN
-- ServerEnvironmentId not provided by user, generate during the insert
INSERT INTO APPL_ServerEnvironment WITH(TABLOCKX)
(
ServerEnvironmentName,
ServerEnvironmentDescription,
DateCreated,
UserCreatedId
)
OUTPUT Inserted.ServerEnvironmentId INTO @APPL_ServerEnvironment
VALUES
(
@ServerEnvironmentName,
@ServerEnvironmentDescription,
GETDATE(),
@UserCreatedId
)
-- Get the new ServerEnvironmentId
SELECT @ServerEnvironmentId = ServerEnvironmentId
FROM @APPL_ServerEnvironment
END
ELSE
BEGIN
-- ServerEnvironmentId is provided by user
INSERT INTO APPL_ServerEnvironment WITH(TABLOCKX)
(
ServerEnvironmentName,
ServerEnvironmentDescription,
DateCreated,
UserCreatedId,
ServerEnvironmentId
)
OUTPUT Inserted.ServerEnvironmentId INTO @APPL_ServerEnvironment
VALUES
(
@ServerEnvironmentName,
@ServerEnvironmentDescription,
GETDATE(),
@UserCreatedId,
@ServerEnvironmentId
)
END
(لماذا قفل الجدول بأكمله أثناء الإدراج؟)