in internal/database/sqlserver/sqlserver.go [323:369]
func (h sqlServerHandler) GenerateCommentSQL(db *database.DB, data *database.CommentData, enrichments map[string]bool) (string, error) {
if data == nil {
return "", fmt.Errorf("metadata cannot be nil")
}
if data.TableName == "" || data.ColumnName == "" {
return "", fmt.Errorf("table and column names cannot be empty")
}
config := database.GetConfig() // Retrieve global config
newMetadataComment := h.generateMetadataComment(data, enrichments)
existingComment, err := h.GetColumnComment(context.Background(), db, data.TableName, data.ColumnName)
if err != nil {
return "", err
}
finalComment := h.mergeComments(existingComment, newMetadataComment, config.UpdateExistingMode) // Pass updateExistingMode
// Check if comment already exists to decide between sp_addextendedproperty and sp_updateextendedproperty
query := `
SELECT CAST(value as NVARCHAR(MAX))
FROM fn_listextendedproperty (N'MS_Description', N'SCHEMA', N'dbo', N'TABLE', @tableName, N'COLUMN', @columnName)
`
var existingCommentDB string
err = db.QueryRow(query, sql.Named("tableName", data.TableName), sql.Named("columnName", data.ColumnName)).Scan(&existingCommentDB)
if err != nil && err != sql.ErrNoRows {
return "", fmt.Errorf("failed to check for existing comment: %w", err)
}
var sqlStmt string
if err == sql.ErrNoRows {
// No existing comment, use sp_addextendedproperty
sqlStmt = fmt.Sprintf(
"EXEC sp_addextendedproperty N'MS_Description', N'%s', N'SCHEMA', N'dbo', N'TABLE', %s, N'COLUMN', %s;",
finalComment,
h.QuoteIdentifier(data.TableName),
h.QuoteIdentifier(data.ColumnName),
)
} else {
// Existing comment found, use sp_updateextendedproperty
sqlStmt = fmt.Sprintf(
"EXEC sp_updateextendedproperty N'MS_Description', N'%s', N'SCHEMA', N'dbo', N'TABLE', %s, N'COLUMN', %s;",
finalComment, // Use the merged comment
h.QuoteIdentifier(data.TableName),
h.QuoteIdentifier(data.ColumnName),
)
}
return sqlStmt, nil
}