Cela me rend fou. J'ai une petite table SQL Server 2012 avec les colonnes suivantes:La table SQL Server ne parvient pas à mettre à jour
id int (this is an IDENTITY column)
DateNewsletter smalldatetime
SubjectNewsletter varchar(100)
ContentHeader varchar(MAX)
ContentNewsletter varchar(MAX)
ContentFooter varchar(MAX)
NewsletterSent bit
DateSent smalldatetime
ApprovalPending bit
PriorityHigh bit
Il y a 583 lignes dans la table.
Voici le problème:
- je peux
SELECT *
sans problème - je peux
INSERT INTO
sans problème Cependant, quand je lance la requête suivante, tout explose:
UPDATE tblElinesNewsletter SET NewsletterSent = 1, DateSent = GETDATE(), ApprovalPending = 0 WHERE (NewsletterSent = 0)
Chaque fois que je lance l'abo code ve, j'obtiens une erreur de timeout. L'erreur de délai d'expiration est la même si je l'exécute à partir de la page ASP.NET ou de SQL Server Management Studio.
De plus, si je clique avec le bouton droit de la souris sur SSMS et que je choisis "Modifier les 200 premières lignes ...", la grille sera affichée et je pourrai éditer. Mais dès que je clique et que j'effectue la mise à jour, ça explose.
J'ai essayé ce qui suit déjà:
- Reconstruire l'index
- Créer une table de marque nouvelle avec les mêmes données de schéma et de transfert là-bas
- Redémarrez le serveur
- Aller au Home Depot et d'acheter une grande boîte de spackle pour réparer les trous dans le mur de bureau (de me frapper la tête contre)
Ce n'est pas un grande table. Il stocke simplement du HTML pour un bulletin d'information électronique.
Cela n'a pas toujours été le cas et cela n'a commencé que quelques mois plus tôt. Cela a bien fonctionné avant cela. Maintenant, tout ce qui précède dit, voici le kicker: il ne le fait pas tout le temps. Parfois cela fonctionne. Ce qui a été remarqué, c'est que s'il y a un bulletin plus long dans le tableau, cela ne semble pas fonctionner, si le bulletin est très court. Ce sont des newsletters simples et pas trop de fantaisie, en voici une ici: http://unitedafa.org/news/elines/view/?id=104169
Ceci tire de la base de données/table que je discute ci-dessus.
Cette installation de SQL Server se trouve sur une boîte Windows Server 2012 avec 6 Go de RAM et n'exécute que quelques sites Web qui n'obtiennent pas beaucoup de trafic. Une chose que je remarque en essayant de déboguer ceci, est que quand j'exécute la procédure stockée de SQL Server de la page Web d'ASP.NET, quand elle échoue, ceci semble geler le SQL Server et Je ne peux pas exécuter la même procédure stockée dans SSMS. Cependant, une fois que je redémarre le serveur, je peux alors ouvrir SSMS et exécuter la procédure stockée. Encore une fois, si j'exécute la procédure stockée à partir de la page Web, il gèle à nouveau le serveur et je ne peux exécuter aucune requête de mise à jour sur cette table.
Juste pour référence, voici la procédure stockée réelle qui est appelé à partir de la page:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- ======================================================
-- Author: Christopher Lee
-- Create date: 16-Aug-2012
-- Modify date: 16-Aug-2012
-- Description: Mark all records as Sent.
-- ======================================================
ALTER PROCEDURE [dbo].[sProc_Elines_Send_MarkComplete]
AS
BEGIN TRANSACTION
UPDATE tblElinesNewsletter
SET NewsletterSent = 1,
DateSent = GETDATE(),
ApprovalPending = 0
WHERE (NewsletterSent = 0)
COMMIT
Aussi, voici le script CREATE TABLE
:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tblElinesNewsletter]
(
[id] [int] IDENTITY(100543,1) NOT NULL,
[DateNewsletter] [smalldatetime] NOT NULL,
[SubjectNewsletter] [varchar](100) NOT NULL,
[ContentHeader] [varchar](max) NOT NULL,
[ContentNewsletter] [varchar](max) NOT NULL,
[ContentFooter] [varchar](max) NOT NULL,
[NewsletterSent] [bit] NOT NULL,
[DateSent] [smalldatetime] NULL,
[ApprovalPending] [bit] NOT NULL,
[PriorityHigh] [bit] NOT NULL,
CONSTRAINT [PK_tblElinesNewsletter2]
PRIMARY KEY CLUSTERED ([id] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[tblElinesNewsletter]
ADD CONSTRAINT [DF_tblElinesNewsletter2_PriorityHigh] DEFAULT ((0)) FOR [PriorityHigh]
GO
Toute idée sur la terre que je fais faux? BTW, je ne suis pas un administrateur de base de données et plus familier avec le code Web ASP.NET, etc., plus de déclarations SQL.
Toute aide ou conseil serait apprécié!
- Chris
PS, voici quelques informations supplémentaires:
plan d'exécution de requêtes SQL Server sur le Proc stocké:
[Plan d'exécution SQL Server Capture d'écran] [1]
Voici quelques informations supplémentaires:
- Espace disque suffisant.
- Il n'y a pas d'autres processus concurrents.
La proc stockée est en fait exécutée dans une séquence avec deux autres avant elle. Voici le code de la page exécution:
Protected Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click
Call WriteNewsletterFile()
Call SendNewsletter()
Call UpdateRecord()
End Sub
Ainsi, le WriteNewsletterFile() et le SendNewsletter() des sous-routines fonctionnent très bien. Il explose sur le sous-programme UpdateRecord. Voici le code pour chacune des routines:
Sub WriteNewsletterFile()
Dim NewsID As String = ""
Dim Conn As SqlConnection
Dim Cmd As SqlCommand
Dim Rdr As SqlDataReader
Conn = New SqlConnection(ConfigurationManager.ConnectionStrings("UnitedAFAConnectionStringNSS").ConnectionString)
Cmd = New SqlCommand()
Cmd.CommandText = "sProc_Elines_Send_GetContentPending"
Cmd.CommandType = CommandType.StoredProcedure
Cmd.Connection = Conn
Cmd.Connection.Open()
Rdr = Cmd.ExecuteReader(CommandBehavior.CloseConnection)
If Rdr.HasRows Then
While Rdr.Read
NewsID = Rdr("id")
NewsletterSubject = Rdr("SubjectNewsletter")
NewsletterHeader = Rdr("ContentHeader")
NewsletterContent = Rdr("ContentNewsletter")
NewsletterFooter = Rdr("ContentFooter")
End While
End If
Conn.Close()
Conn.Dispose()
Cmd.Dispose()
' Header
NewsletterHeaderForEmail = NewsletterHeader.Replace("<p>", "<p style=""font-family: Arial, Helvetica, sans-serif; font-size: 12pt; line-height: 1.3em;margin-bottom:1em"">")
NewsletterHeaderForEmail = NewsletterHeaderForEmail.Replace("<li>", "<li style=""font-family: Arial, Helvetica, sans-serif; font-size: 12pt; line-height: 1.3em;margin-bottom:1em"">")
NewsletterHeaderForEmail = NewsletterHeaderForEmail.Replace("[NewsID]", NewsID)
' Footer
NewsletterFooterForEmail = NewsletterFooter.Replace("<p>", "<p style=""font-family: Arial, Helvetica, sans-serif; font-size: 12pt; line-height: 1.3em;margin-bottom:1em"">")
NewsletterFooterForEmail = NewsletterFooterForEmail.Replace("<li>", "<li style=""font-family: Arial, Helvetica, sans-serif; font-size: 12pt; line-height: 1.3em;margin-bottom:1em"">")
' Content
NewsletterContentForEmail = NewsletterContent.Replace("<p>", "<p style=""font-family: Arial, Helvetica, sans-serif; font-size: 12pt; line-height: 1.3em;margin-bottom:1em"">")
NewsletterContentForEmail = NewsletterContentForEmail.Replace("<li>", "<li style=""font-family: Arial, Helvetica, sans-serif; font-size: 12pt; line-height: 1.3em;margin-bottom:1em"">")
NewsletterContentForEmail = "<table border=""0"" cellpadding=""0"" cellspacing=""0""><tr><td style=""font-family: Arial, Helvetica, sans-serif; font-size: 12pt"">" & NewsletterContentForEmail & "</td></tr></table>"
NewsletterFinalReadyForSending = NewsletterHeaderForEmail & NewsletterContentForEmail & NewsletterFooterForEmail
Dim filePath2 As String = "C:\Programs\SendElines.bat"
Dim w2 As StreamWriter
w2 = File.CreateText(filePath2)
w2.WriteLine("START """" ""C:\Program Files (x86)\Gammadyne Mailer\gm.exe"" /s /n /subject""" & NewsletterSubject & """ /html""C:\Programs\elines.html"" ""C:\Users\Public\Documents\Newsletters\Elines\Sending Template - Elines.mmp""")
w2.Flush()
w2.Close()
Dim filePath As String = "C:\Programs\elines.html"
Dim w As StreamWriter
w = File.CreateText(filePath)
w.WriteLine(NewsletterFinalReadyForSending)
w.Flush()
w.Close()
End Sub
Sub SendNewsletter()
Dim Conn As New SqlConnection(ConfigurationManager.ConnectionStrings("UnitedAFAConnectionStringAfaNewsletters").ConnectionString)
Dim MySQL As String = "sProc_SendElines"
Dim Cmd As New Data.SqlClient.SqlCommand(MySQL, Conn)
Cmd.CommandType = CommandType.StoredProcedure
Conn.Open()
Cmd.ExecuteNonQuery()
Conn.Close()
Conn.Dispose()
End Sub
Sub UpdateRecord()
Dim Conn As New SqlConnection(ConfigurationManager.ConnectionStrings("UnitedAFAConnectionStringNSS").ConnectionString)
Dim MySQL As String = "sProc_Elines_Send_MarkComplete"
Dim Cmd As New Data.SqlClient.SqlCommand(MySQL, Conn)
Cmd.CommandType = CommandType.StoredProcedure
Conn.Open()
Cmd.ExecuteNonQuery()
Conn.Close()
Conn.Dispose()
End Sub
Et voici le code pour le SendElines Subroutine:
USE [afanewsletters]
GO
/****** Object: StoredProcedure [dbo].[sProc_SendElines] Script Date: 9/5/2017 2:51:08 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- ======================================================
-- Author: Christopher Lee
-- Create date: 21-Aug-2012
-- Modify date: 21-Aug-2012
-- Description: Runs the Elines sending BAT file.
-- ======================================================
ALTER PROCEDURE [dbo].[sProc_SendElines]
AS
EXEC xp_logevent 67845, 'Send Elines', informational
Je tiens à souligner que les SendElines() stored proc est sur une autre base de données (mais sur le même serveur). Encore une fois cependant, pour être clair, les deux premiers sous-programmes fonctionnent bien. C'est juste le sProc_Elines_Send_MarkComplete qui explose.
Voici le code pour sProc_Elines_Send_GetContentPending:
USE [Newsletters]
GO
/****** Object: StoredProcedure [dbo].[sProc_Elines_Send_GetContentPending] Script Date: 9/6/2017 6:57:06 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- ======================================================
-- Author: Christopher Lee
-- Create date: 16-Aug-2012
-- Modify date: 16-Aug-2012
-- Description: Get content for Elines for approval.
-- ======================================================
ALTER PROCEDURE [dbo].[sProc_Elines_Send_GetContentPending]
AS
BEGIN TRY
BEGIN TRANSACTION
SELECT * FROM tblElinesNewsletter
WHERE (NewsletterSent = 0)
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
RAISERROR ('Problem with sProc_Elines_Send_GetContentPending, please contact the MEC Webmaster at [email protected]', 16, 1)
END CATCH
est ici les résultats de la DBCC OPENTRAN je courais. Les deux premiers processus stockés (sProc_Elines_Send_GetContentPending et sProc_SendElines) ont été exécutés avec succès. Toutefois, lorsque sProc_Elines_Send_MarkComplete a été exécuté et bloqué, j'ai exécuté le DBCC OPENTRAN qui contenait le message: "Aucune transaction ouverte active". Capture d'écran jointe: Here's the DBCC OPENTRAN screenshot
Y a-t-il des triggers sur cette table? Aussi, pouvez-vous poster le message d'erreur exact que vous obtenez? – Sparrow
Votre table n'a pas de colonne 'IDENTITY'. peut-être que ça va aider? (PS Je ne suis pas non plus un DBA) – VDWWD
Un timeout sur une petite table suggère un blocage. –