Skip to content

Commit 0014f1b

Browse files
committed
fix: prevent SQL error "Property 'MS_Description' already exists"
Fire either sp_addextendedproperty or sp_updateextendedproperty for setting a MS SQL column comment Refs #2552
1 parent 3fca286 commit 0014f1b

3 files changed

Lines changed: 32 additions & 8 deletions

File tree

source/dbstructures.mssql.pas

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,31 @@ function TMsSqlProvider.GetSql(AId: TQueryId): string;
455455
qLikeCompare: Result := '%s LIKE %s';
456456
qAddColumn: Result := 'ADD %s';
457457
qChangeColumn: Result := 'ALTER COLUMN %s %s';
458+
qSetColumnComment: Result := 'IF NOT EXISTS (' + sLineBreak +
459+
' SELECT 1' + sLineBreak +
460+
' FROM fn_listextendedproperty (' + sLineBreak +
461+
' N''MS_Description'',' + sLineBreak +
462+
' N''SCHEMA'', :EscapedSchema,' + sLineBreak +
463+
' N''TABLE'', :EscapedName,' + sLineBreak +
464+
' N''COLUMN'', :TargetColumn' + sLineBreak +
465+
' )' + sLineBreak +
466+
')' + sLineBreak +
467+
'BEGIN' + sLineBreak +
468+
' EXEC sys.sp_addextendedproperty' + sLineBreak +
469+
' @name = N''MS_Description'',' + sLineBreak +
470+
' @value = :NewComment,' + sLineBreak +
471+
' @level0type = N''SCHEMA'', @level0name = :EscapedSchema,' + sLineBreak +
472+
' @level1type = N''TABLE'', @level1name = :EscapedName,' + sLineBreak +
473+
' @level2type = N''COLUMN'', @level2name = :TargetColumn' + sLineBreak +
474+
'END' + sLineBreak +
475+
'ELSE BEGIN' + sLineBreak +
476+
' EXEC sys.sp_updateextendedproperty' + sLineBreak +
477+
' @name = N''MS_Description'',' + sLineBreak +
478+
' @value = :NewComment,' + sLineBreak +
479+
' @level0type = N''SCHEMA'', @level0name = :EscapedSchema,' + sLineBreak +
480+
' @level1type = N''TABLE'', @level1name = :EscapedName,' + sLineBreak +
481+
' @level2type = N''COLUMN'', @level2name = :TargetColumn' + sLineBreak +
482+
'END';
458483
qSessionVariables: Result := 'SELECT comment, value FROM master.dbo.syscurconfigs ORDER BY comment';
459484
qGlobalVariables: Result := 'SELECT comment, value FROM master.dbo.syscurconfigs ORDER BY comment';
460485
qISSchemaCol: Result := '%s_CATALOG';

source/dbstructures.pas

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ interface
4040
TQueryId = (qDatabaseTable, qDatabaseTableId, qDatabaseDrop,
4141
qDbObjectsTable, qDbObjectsCreateCol, qDbObjectsUpdateCol, qDbObjectsTypeCol,
4242
qEmptyTable, qRenameTable, qRenameView, qCurrentUserHost, qLikeCompare,
43-
qAddColumn, qChangeColumn, qRenameColumn, qForeignKeyEventAction,
43+
qAddColumn, qChangeColumn, qRenameColumn, qSetColumnComment, qForeignKeyEventAction,
4444
qGlobalStatus, qCommandsCounters, qSessionVariables, qGlobalVariables,
4545
qISSchemaCol,
4646
qUSEQuery, qKillQuery, qKillProcess,

source/table_editor.pas

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,7 @@ function TfrmTableEditor.ComposeAlterStatement: TSQLBatch;
647647
Constraint: TCheckConstraint;
648648
Node: PVirtualNode;
649649
Conn: TDBConnection;
650+
Params: TStringMap;
650651

651652
procedure FinishSpecs;
652653
begin
@@ -660,7 +661,7 @@ function TfrmTableEditor.ComposeAlterStatement: TSQLBatch;
660661
procedure AddQuery(Query: String);
661662
begin
662663
FinishSpecs;
663-
SQL := SQL + Format(Query, [DBObject.QuotedName]) + ';' + CRLF;
664+
SQL := SQL + Format(Query, [DBObject.QuotedName]) + ';' + sLineBreak;
664665
end;
665666
begin
666667
// Compose ALTER query, called by buttons and for SQL code tab
@@ -778,12 +779,10 @@ function TfrmTableEditor.ComposeAlterStatement: TSQLBatch;
778779
Specs.Add(Format(AddColBase, [ColSpec]));
779780
end;
780781
end;
781-
AddQuery('EXECUTE sp_addextendedproperty '+Conn.EscapeString('MS_Description')+', '+
782-
Conn.EscapeString(Col.Comment)+', '+
783-
Conn.EscapeString('Schema')+', '+Conn.EscapeString(DBObject.Schema)+', '+
784-
Conn.EscapeString('table')+', '+Conn.EscapeString(DBObject.Name)+', '+
785-
Conn.EscapeString('column')+', '+Conn.EscapeString(Col.Name)
786-
);
782+
Params := DBObject.AsStringMap;
783+
Params.Add('NewComment', Conn.EscapeString(Col.Comment));
784+
Params.Add('TargetColumn', Conn.EscapeString(Col.Name));
785+
AddQuery(Conn.SqlProvider.GetSql(qSetColumnComment, Params));
787786
end;
788787

789788
ngPgSQL: begin

0 commit comments

Comments
 (0)