Mit EXISTS kehren falsche Werte in Script über Management Studio zurück

Ich habe ein Problem mit folgenden Fragen.

Teil 1

Aktualisiert den Tisch.

Teil 2

Ändert den Spaltennamen.

Wenn ich das Skript über Management Studio wiederholen bekomme ich einen Fehler,

Die Spalte "permissiontype_id" existiert nicht.

Die Select Statement in Exists zeigt das richtige Ergebnis …

Ich bekomme solche Fehler mit einigen Aussagen in meinem Drehbuch und muss sie loswerden …

Erste Aussage

IF EXISTS ( SELECT 1 FROM sys.columns WHERE NAME = N'permissiontype_id' AND Object_ID = Object_ID(N'[dbo].[gptbl_user_permission]') ) BEGIN UPDATE gptbl_user_permission SET permissiontype_id = 1 WHERE objecttype_id = 'resultinfo' END GO 

Zweite Aussage

 IF EXISTS ( SELECT * FROM sys.columns WHERE NAME = N'permissiontype_id' AND Object_ID = Object_ID(N'[dbo].[gptbl_user_permission]') ) BEGIN ALTER TABLE [dbo].[gptbl_user_permission] DROP CONSTRAINT PK_gptbl_user_permission EXEC sp_rename '[dbo].[gptbl_user_permission].[permissiontype_id]' , 'permissiontype' , 'COLUMN'; ALTER TABLE [dbo].[gptbl_user_permission] ADD CONSTRAINT PK_gptbl_user_permission PRIMARY KEY CLUSTERED ( [objecttype_id] ASC , [permissiontype] ASC , [user_id] ASC ) WITH ( PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) END GO 

Dieser Fehler ist ein Kompilierzeiterrors und sein nicht wegen EXISTS . Wenn Sie Ihre EXISTS Abfrage nach dem zweiten Lauf ausführen, wird es nichts zurückgeben

 SELECT 1 FROM sys.columns WHERE NAME = N'permissiontype_id' AND Object_ID = Object_ID(N'[dbo].[gptbl_user_permission]') 

So zur Laufzeit wird die Steuerung niemals Ihr UPDATE nach dem ersten Lauf erreichen.

 UPDATE gptbl_user_permission SET permissiontype_id = 1 WHERE objecttype_id = 'resultinfo' 

Der Grund, warum Sie diesen Fehler erhalten, liegt daran, dass SQL server nach dem ersten Lauf die Syntax der Abfrage, der Tabelle und der Spalten, die an dieser Abfrage beteiligt sind, überprüft. An diesem Punkt weiß SQL server, dass es keine Spalte permissiontype_id und einen Fehler austriggers.

Lösung

Da dieser Fehler auf Kompilierung zurückzuführen ist, kannst du dynamisches sql verwenden, um die Kompilierung zur Laufzeit für UPDATE wie folgt zu erzwingen:

 IF EXISTS ( SELECT 1 FROM sys.columns WHERE NAME = N'permissiontype_id' AND Object_ID = Object_ID(N'[dbo].[gptbl_user_permission]') ) BEGIN EXEC sp_executeSQL N' UPDATE gptbl_user_permission SET permissiontype_id = 1 WHERE objecttype_id = ''resultinfo''' END GO 

Da EXISTS jedes Mal nach dem ersten Lauf falsch zurückkehrt, wird die dynamische UPDATE statement niemals kompiliert und du bekommst keinen Fehler.