2016-09-16 6 views
0

Ich arbeite mit einem alten Tool und die Datenbank, die mit diesem Tool in längst vergangen war. Ich bin neu dabei und brauche Hilfe, um das zu verstehen. Ich brauche Hilfe beim Schreiben des Codes, den ich jedes Mal ausprobiert und aussortiert habe.Update-Problem mit gespeicherten Prozedur

Ich habe 4 Tabellen Das einzige, was jede Tabelle gemeinsam hat, ist der Spaltenname "AN". Ich brauche zu aktualisieren „AN“, wenn ein Agent dort Namen bisher rechtlich

verändert habe ich mit diesem Verfahren

USE [HSDB] 
GO 
/****** Object: StoredProcedure [dbo].[UpdateNames] Script Date: 9/16/2016 12:32:33 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[UpdateNames] 
--Add the parameters for the stored procedure here 
@AN varchar(MAX) 

AS 
BEGIN 
--SET NOCOUNT ON added to prevent extra result sets from 
--interfering with SELECT statements. 
SET NOCOUNT ON; 
--Insert statements for procedure here 
UPDATE Att 
SET AN = @AN 
WHERE (AN = @AN) 
UPDATE MS 
SET AN = @AN 
WHERE (AN = @AN) 
UPDATE Lost 
SET AN = @AN 
WHERE (AN = @AN) 
UPDATE WeeklyCharges 
SET AN = @AN 
WHERE (AN = @AN) 


END 

Kann jemand bitte sagen Sie mir kommen, was ich falsch mache. Vielen Dank

+0

'SET AN = @AN WHERE AN = @ AN'. Das tut nichts. Sie setzen es auf den gleichen Wert. – Eric

+0

Brauchen Sie wirklich varchar (max)? Sicher sind Ihre Anmeldenamen weniger als 8.000 Zeichen. –

+0

Aber ich bin neugierig. Warum versuchen Sie, Code zu reparieren, wenn keine Datenbank vorhanden ist? Versuchen Sie, eine Datenbank aus dem Anwendungscode zurückzuentwickeln? Es scheint sehr wahrscheinlich, dass es nahezu unmöglich ist, es richtig zu machen. Und ernsthaft den vollen Namen in mehreren Tabellen zu speichern ist einfach schrecklich. Es sollte auf einen einzelnen Eintrittspunkt normalisiert werden. –

Antwort

0

Problem 1: Ihr C# -Code führt 2 Parameter @ LogonName und @OldLogonName, aber Ihre gespeicherte Prozedur akzeptiert nur 1 Parameter @AN. Das sollte also ein Fehler sein.

Problem 2: alle Ihre Update-Anweisungen AN = sich einstellen, weil Sie sagen, wenn AN = @AN dann AN gesetzt = @AN ....

Ohne weitere Einzelheiten über den Fehler aufweist, und Ihre Datenstrukturen, die Sie in Zukunft einbeziehen sollten, ist etwas schwierig zu sagen. Allerdings könnte man wahrscheinlich so etwas wie dies in SQL-Server tut 2012 +:

USE [HSDB] 
GO 
/****** Object: StoredProcedure [dbo].[UpdateNames] Script Date: 9/16/2016 12:32:33 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[UpdateNames] 
--Add the parameters for the stored procedure here 
@LogonName varchar(100) 
,@OldLogonName varchar(100) 

AS 
BEGIN 
--SET NOCOUNT ON added to prevent extra result sets from 
--interfering with SELECT statements. 
SET NOCOUNT ON; 
--Insert statements for procedure here 
BEGIN TRY 

    IF NOT EXISTS (SELECT * FROM LogOnOrUserTable WHERE LogonName = @OldLogonName) 
    BEGIN 
     ;THROW 51000, 'Old Logon Name Does Not Exists', 1 
    END 

    BEGIN TRANSACTION 

    UPDATE Att 
    SET AN = @LogonName 
    WHERE (AN = @OldLogonName) 

    UPDATE MS 
    SET AN = @LogonName 
    WHERE (AN = @OldLogonName) 

    UPDATE Lost 
    SET AN = @LogonName 
    WHERE (AN = @OldLogonName) 

    UPDATE WeeklyCharges 
    SET AN = @LogonName 
    WHERE (AN = @OldLogonName) 

    COMMIT TRANSACTION 

END TRY 
BEGIN CATCH 

     IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION 

    ;THROW 

END CATCH 

END 

Was es tut:

  • erste Tests, um zu sehen, ob die alten Benutzername vorhanden ist, und wenn dies nicht der Fall wirft ein Fehler.
  • aktualisiert dann alle Tabellen, in denen AN = alter Anmeldename und setzt es auf den neuen Anmeldenamen
  • Wenn einer dieser Fehler schlägt die Transaktion zurück und löst einen Fehler aus, so dass Sie keine Änderung haben halb gemacht
+0

@ user6840698 Da meine Antwort für Sie funktioniert, denken Sie bitte daran, sie anzunehmen, damit andere wissen, dass sie beantwortet wurde und die Rufpunkte zugewiesen werden. Danke http://stackoverflow.com/help/someone-answers – Matt

Verwandte Themen