[英]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.