سؤال

كيف يمكنني تخزين الحقل المحدد القيمة إلى متغير من استعلام و استخدامه في تحديث البيان ؟

هنا هو الإجراء:

أنا أكتب SQL Server 2005 T-SQL أو الإجراء المخزن الذي يقوم التالية:

  1. يحصل على قائمة الفواتير معرف من الفاتورة الجدول ومخازن المؤشر
  2. جلب فاتورة معرف من المؤشر -> tmp_key متغير
  3. foreach tmp_key يجد فاتورة العميل الأساسي رقم الاتصال من جدول العملاء
  4. تحديثات العميل الاتصال الرئيسية مع الابتدائي رقم الاتصال
  5. أغلق المؤشر

هنا هو بلدي رمز:

DECLARE @tmp_key int
DECLARE @get_invckey cursor 

set @get_invckey = CURSOR FOR 
    select invckey from tarinvoice where confirmtocntctkey is null and tranno like '%115876'

OPEN @get_invckey 

FETCH NEXT FROM @get_invckey into @tmp_key

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SELECT c.PrimaryCntctKey as PrimaryContactKey
    from tarcustomer c, tarinvoice i
    where i.custkey = c.custkey and i.invckey = @tmp_key

    UPDATE tarinvoice set confirmtocntctkey = PrimaryContactKey where invckey = @tmp_key
    FETCH NEXT FROM @get_invckey INTO @tmp_key
END 

CLOSE @get_invckey
DEALLOCATE @get_invckey

كيف يمكنني تخزين PrimaryContactKey واستخدامها مرة أخرى في مجموعة شرط التحديث التالي البيان ؟ إنشاء متغير مؤشر أو مجرد المحلي متغير مع نوع int?

هل كانت مفيدة؟

المحلول

DECLARE @tmp_key int
DECLARE @get_invckey cursor 

SET @get_invckey = CURSOR FOR 
    SELECT invckey FROM tarinvoice WHERE confirmtocntctkey IS NULL AND tranno LIKE '%115876'

OPEN @get_invckey 

FETCH NEXT FROM @get_invckey INTO @tmp_key

DECLARE @PrimaryContactKey int --or whatever datatype it is

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SELECT @PrimaryContactKey=c.PrimaryCntctKey
    FROM tarcustomer c, tarinvoice i
    WHERE i.custkey = c.custkey AND i.invckey = @tmp_key

    UPDATE tarinvoice SET confirmtocntctkey = @PrimaryContactKey WHERE invckey = @tmp_key
    FETCH NEXT FROM @get_invckey INTO @tmp_key
END 

CLOSE @get_invckey
DEALLOCATE @get_invckey

تحرير:
هذا السؤال قد حصلت على الكثير من الجر مما كان متوقعا.ملاحظة أنني لا أدعو إلى استخدام المؤشر في جوابي ، بل تبين كيفية تعيين القيمة على أساس السؤال.

نصائح أخرى

أنا فقط كان عندي نفس المشكلة...

declare @userId uniqueidentifier
set @userId = (select top 1 UserId from aspnet_Users)

أو حتى أقصر:

declare @userId uniqueidentifier
SELECT TOP 1 @userId = UserId FROM aspnet_Users

جرب هذا

SELECT @PrimaryContactKey = c.PrimaryCntctKey
FROM tarcustomer c, tarinvoice i
WHERE i.custkey = c.custkey 
    AND i.invckey = @tmp_key

UPDATE tarinvoice SET confirmtocntctkey = @PrimaryContactKey 
WHERE invckey = @tmp_key
FETCH NEXT FROM @get_invckey INTO @tmp_key

سوف تعلن هذا المتغير خارج حلقة فقط معيار tsql ضمن متغير.

يجب أن نلاحظ أيضا أن هذا هو كيف يمكنك أن تفعل ذلك في أي نوع من تحديد إلى متغير, ليس فقط عند التعامل مع المؤشرات.

لماذا كنت في حاجة الى المؤشر في كل شيء ؟ الخاص بك كامل الجزء من التعليمات البرمجية يمكن الاستعاضة عن هذا الذي سيتم تشغيل أسرع كثيرا على أعداد كبيرة من الصفوف.

UPDATE tarinvoice set confirmtocntctkey = PrimaryCntctKey 
FROM tarinvoice INNER JOIN tarcustomer ON tarinvoice.custkey = tarcustomer.custkey
WHERE confirmtocntctkey is null and tranno like '%115876'

من أجل تعيين متغير بأمان لديك لاستخدام مجموعة-SELECT:

SET @PrimaryContactKey = (SELECT c.PrimaryCntctKey
    FROM tarcustomer c, tarinvoice i
    WHERE i.custkey = c.custkey 
    AND i.invckey = @tmp_key)

تأكد من أن لديك كل بداية و نهاية قوسين!

السبب المجموعة-اختر الإصدار هو الطريق الأسلم إلى تعيين متغير ذو شقين.

1.تحديد عوائد عدة وظائف

ماذا يحدث إذا التالية حدد النتائج في العديد من المناصب ؟

SELECT @PrimaryContactKey = c.PrimaryCntctKey
FROM tarcustomer c, tarinvoice i
WHERE i.custkey = c.custkey 
    AND i.invckey = @tmp_key

@PrimaryContactKey سيتم تعيين القيمة من آخر مشاركة في النتيجة.

في الواقع @PrimaryContactKey سيتم تعيين قيمة واحدة لكل وظيفة في نتيجة لذلك ونتيجة لذلك سوف تحتوي على قيمة آخر مشاركة حدد الأوامر كانت المعالجة.

أي آخر هو "آخر" يتم تحديدها من قبل أي فهارس متفاوتة المسافات أو ، إذا لم يوجد فهرس متفاوت المسافات يستخدم أو المفتاح الأساسي هو متفاوت المسافات, "آخر" بوست سوف يكون الأكثر وأضاف في الآونة الأخيرة بعد.هذا السلوك يمكن في أسوأ سيناريو يمكن تغييرها في كل مرة الفهرسة الجدول يتغير.

مع مجموعة-SELECT المتغير الخاص بك سيتم تعيين null.

2.تحديد إرجاع أية وظيفة

ماذا يحدث عند استخدام النسخة الثانية من القانون إذا حدد لا يرجع نتيجة على الإطلاق ؟

في على عكس ما قد يعتقد قيمة المتغير لن تكون فارغة - تحتفظ إنها القيمة السابقة!

هذا هو لأنه ، كما ذكر أعلاه, SQL سيتم تعيين قيمة متغير مرة واحدة في آخر - وهذا يعني أنه لن يفعل أي شيء مع متغير إذا كانت النتيجة لا يحتوي على وظائف.لذا المتغير سوف لا تزال لديها قيمة كان قبل ركض البيان.

مع مجموعة SELECT سوف تكون القيمة null.

انظر أيضا: مجموعة مقابل حدد عند تعيين المتغيرات ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top