簡體   English   中英

T-SQL存儲過程的可選參數的無值傳遞查詢

[英]Pass-through query with no value for optional parameter of T-SQL stored procedure

我有一個Access表單來編輯SQL Server 2008 R2表中的記錄。

表單中有3個字段可以更新,但可能3個字段中的一個或全部仍為空(空),因此更新是第一次設置值。

如果字段當時要運行存儲過程為NULL ,並且我第一次添加值,則存儲過程將因缺少參數而失敗。

存儲過程如下所示:

ALTER PROCEDURE [dbo].[spAlarmprotokollaendern] 
    @FibuNr nvarchar(10)=Null,
    @FibuNr_alt nvarchar(10),
    @Preis decimal(5,2),
    @Preis_alt decimal(5,2)=null,
    @Alarmnummer int,
    @Kennung nvarchar(10),
    @Verrechnungsintervall int=null,
    @Verrechnungsintervall_alt int=null,
    @UserID int=null,
    @Objektname nvarchar(50)=null,
    @Objektstrasse nvarchar(60)=null,
    @ObjektPLZ nvarchar(6)=null,
    @Objektort nvarchar(50)=null,
    @Kostenstelle int, 
    @Objektnummer int

    UPDATE tblAlarmprotokolle 
    SET Fibunr = coalesce(@Fibunr, @Fibunr_alt), 
        Preis = coalesce(@Preis, @Preis_alt), 
        Verrechnungsintervall = coalesce(@Verrechnungsintervall, @Verrechnungsintervall_alt)
    WHERE 
        (Alarmnummer >= @Alarmnummer AND Kennung = @Kennung) 
        OR (abgerechnet = 0 AND Kennung = @Kennung)

我使用合並檢查該字段的任何新值並設置舊字段。 但是,如果舊字段為NULL,則它將失敗。

我該如何進行這項工作?

謝謝邁克爾

T-SQL存儲過程的可選參數值的占位符是DEFAULT關鍵字。 因此,如果您的訪問代碼正在生成以下傳遞查詢調用,但失敗

EXEC dbo.spAlarmprotokollaendern '11150', '', 56.7, , 32627471 ...

如果相應的Access值為null,則將其插入DEFAULT關鍵字:

EXEC dbo.spAlarmprotokollaendern '11150', '', 56.7, DEFAULT, 32627471 ...

請注意,您的EXEC語句必須包含裸關鍵字DEFAULT ,而不是字符串值'DEFAULT' ,例如

Option Compare Database
Option Explicit

Sub SO32779923()
    Dim myFibunr, myFibunr_alt, myPreis, myPreis_alt, _
            myAlarmnummer, myKennung, _
            myVerrechnungsintervall, myVerrechnungsintervall_alt, _
            myUserID, myObjektname, myObjektstrasse, myObjektPLZ, _
            myObjektort, myKostenstelle, myObjektnummer
    myFibunr = "11150"
    myFibunr_alt = ""
    myPreis = 56.7
    myPreis_alt = Null
    myAlarmnummer = 32627471
    myKennung = "update_me"
    myVerrechnungsintervall = 4
    myVerrechnungsintervall_alt = Null
    myUserID = 0
    myObjektname = "x"
    myObjektstrasse = "x"
    myObjektPLZ = "x"
    myObjektort = "x"
    myKostenstelle = 0
    myObjektnummer = 0

    Dim spCall As String
    spCall = "EXEC dbo.spAlarmprotokollaendern " & _
            prepForSp(myFibunr) & ", " & _
            prepForSp(myFibunr_alt) & ", " & _
            prepForSp(myPreis) & ", " & _
            prepForSp(myPreis_alt) & ", " & _
            prepForSp(myAlarmnummer) & ", " & _
            prepForSp(myKennung) & ", " & _
            prepForSp(myVerrechnungsintervall) & ", " & _
            prepForSp(myVerrechnungsintervall_alt) & ", " & _
            prepForSp(myUserID) & ", " & _
            prepForSp(myObjektname) & ", " & _
            prepForSp(myObjektstrasse) & ", " & _
            prepForSp(myObjektPLZ) & ", " & _
            prepForSp(myObjektort) & ", " & _
            prepForSp(myKostenstelle) & ", " & _
            prepForSp(myObjektnummer)

    Debug.Print spCall

    Dim cdb As DAO.Database
    Set cdb = CurrentDb
    Dim qdf As DAO.QueryDef
    Set qdf = cdb.CreateQueryDef("")
    qdf.Connect = "ODBC;DSN=myDb"
    qdf.sql = spCall
    qdf.ReturnsRecords = False
    qdf.Execute
    Set qdf = Nothing
End Sub

Private Function prepForSp(thing As Variant) As String
    If IsNull(thing) Then
        prepForSp = "DEFAULT"
    Else
        Select Case VarType(thing)
            Case vbString:
                prepForSp = "'" & Replace(thing, "'", "''") & "'"
            Case vbDate:
                prepForSp = "'" & Format(thing, "yyyy-mm-dd Hh:Nn:Ss") & "'"
            Case Else
                prepForSp = CStr(thing)
        End Select
    End If
End Function

顯示Debug.Print語句

EXEC dbo.spAlarmprotokollaendern '11150', '', 56.7, DEFAULT, 32627471, 'update_me', 4, DEFAULT, 0, 'x', 'x', 'x', 'x', 0, 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM