Ich habe einen C # -Code, der viele Einfügeanweisungen in einem Stapel ausführt. Während der Ausführung dieser Anweisungen erhielt ich den Fehler "String oder binäre Daten würden abgeschnitten" und die Transaktion roledback.
Um herauszufinden, welche insert-Anweisung dies verursacht hat, muss ich den SQLServer nacheinander einfügen, bis der Fehler angezeigt wird.
Gibt es eine clevere Methode, um herauszufinden, welche Anweisung und welches Feld dieses Problem durch Ausnahmebehandlung verursacht hat? (SqlException)
Im Allgemeinen gibt es keine Möglichkeit festzustellen, welche Anweisung den Fehler verursacht hat. Wenn Sie mehrere ausführen, können Sie sich den Profiler ansehen und die letzte abgeschlossene Anweisung betrachten und sehen, wie die Anweisung danach aussehen könnte. Ich habe jedoch keine Ahnung, ob dieser Ansatz für Sie machbar ist.
In jedem Fall ist eine Ihrer Parametervariablen (und die darin enthaltenen Daten) zu groß für das Feld, in dem die Daten gespeichert werden sollen. Überprüfen Sie Ihre Parametergrößen mit den Spaltengrößen, und die betreffenden Felder sollten schnell ersichtlich sein.
Diese Art von Fehler tritt auf, wenn der Datentyp der SQL Server-Spalte eine Länge hat, die kleiner ist als die Länge der Daten, die in das Eingabeformular eingegeben wurden.
diese Art von Fehler tritt im Allgemeinen auf, wenn Sie Zeichen oder Werte über die in der Datenbanktabelle angegebenen Werte setzen müssen, wie in diesem Fall: Sie geben. transaction_status varchar (10) Sie versuchen jedoch tatsächlich, _ transaction_status mit 19 Zeichen zu speichern. Deshalb sind Sie in diesem Code auf diese Art von Fehlern gestoßen
BEGIN TRY
INSERT INTO YourTable (col1, col2) VALUES (@val1, @val2)
END TRY
BEGIN CATCH
--print or insert into error log or return param or etc...
PRINT '@val1='+ISNULL(CONVERT(varchar,@val1),'')
PRINT '@val2='+ISNULL(CONVERT(varchar,@val2),'')
END CATCH
Im Allgemeinen fügen Sie einen Wert ein, der größer als der maximal zulässige Wert ist. Beispielsweise kann die Datenspalte nur bis zu 200 Zeichen enthalten, aber Sie fügen eine Zeichenfolge mit 201 Zeichen ein
Sie sollten mit etwas wie enden
SELECT
Col1, Col2, ..., [ColN]
INTO [MyTempTable]
FROM
[Tables etc.]
WHERE 0 = 1
Dadurch wird in Ihrer Datenbank eine Tabelle namens MyTempTable erstellt, die Sie mit Ihrer Zieltabellenstruktur vergleichen können, d. H. Sie können die Spalten in beiden Tabellen vergleichen, um zu sehen, wo sie sich unterscheiden. Es ist ein bisschen ein Workaround, aber es ist die schnellste Methode, die ich gefunden habe.
Es hängt davon ab, wie Sie die Einfüge-Aufrufe durchführen. Alles als ein Anruf oder als Einzelgespräch innerhalb einer Transaktion? Wenn einzelne Anrufe, dann ja (wenn Sie die Aufrufe durchlaufen, fangen Sie den fehlgeschlagenen Anruf ein). Wenn ein großer Anruf, dann nein. SQL verarbeitet die gesamte Anweisung und ist daher nicht in den Händen des Codes.
Es kann auch sein, dass Sie versuchen, einen null
-Wert wieder in die Datenbank zu übernehmen. Eine Ihrer Transaktionen könnte also Nullen enthalten.
Bei den meisten Antworten handelt es sich um die offensichtliche Prüfung, dass die in der Datenbank definierte Länge der Spalte nicht kleiner als die Daten ist, die Sie in die Datenbank eingeben möchten.
Mehrere Male bin ich gebissen worden, als ich zu SQL Management Studio gegangen bin und folgendes gemacht habe:
sp_help 'mytable'
und seien Sie ein paar Minuten verwirrt, bis mir klar wird, dass die betreffende Spalte eine nvarchar ist. Dies bedeutet, dass die von sp_help gemeldete Länge wirklich doppelt so groß ist wie die tatsächlich unterstützte Länge, da es sich um einen Doppelbyte-Datentyp (Unicode) handelt.
wenn sp_help nvarchar Length 40 meldet, können Sie maximal 20 Zeichen speichern.
Mit Linq To SQL habe ich ein Debugging durchgeführt, indem ich den Kontext protokollierte, z. Context.Log = Console.Out
Dann überprüfte SQL auf offensichtliche Fehler. Es gab zwei:
-- @p46: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value1]
-- @p8: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value2]
das letzte, was ich beim Durchsuchen des Tabellenschemas mit den Werten gefunden habe, war nvarchar (20), aber der Wert betrug 22 Zeichen
-- @p41: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [1234567890123456789012]
In unserem eigenen Fall erhöhe ich die zulässige Zeichen- oder Feldgröße der SQL-Tabelle, die geringer ist als die Gesamtzahl der vom Front-End veröffentlichten Zeichen. Daher ist das Problem gelöst.