appena trascorso troppo tempo a cercare di capire il motivo per cui questo stava accadendo su un database di produzione che può accedere solo tramite mylittlesql. Non è stato possibile riprodurre il problema ma ho creato questo script da bit di sp_rename, così quando succede la prossima volta riesco a scoprire esattamente perché. Sì è eccessivo, ma potrebbe aiutare qualcun altro.
C'è un problema se in qualche modo riesci a ottenere '[' o ']' nel nome della colonna reale come memorizzato in sys.columns, (? 'Nvarchar' come nome della colonna ????). PARSENAME non gestisce [] e restituisce null, quindi sp_rename non funzionerà.
Questo sarà solo aiutare a diagnosticare il problema per il caso 'colonna' con il codice di errore 15248 che è dove io continuo ad avere questo problema:
declare @objname nvarchar(1035) = N'dbo.EducationTypes.nvarchar' -- input to sp_rename
declare @newname sysname = N'EducationTypeTitle' -- input to sp_rename
declare @UnqualOldName sysname,
@QualName1 sysname,
@QualName2 sysname,
@QualName3 sysname,
@OwnAndObjName nvarchar(517),
@SchemaAndTypeName nvarchar(517),
@objid int,
@xtype nchar(2),
@colid int,
@retcode int
select @UnqualOldName = parsename(@objname, 1),
@QualName1 = parsename(@objname, 2),
@QualName2 = parsename(@objname, 3),
@QualName3 = parsename(@objname, 4)
print 'Old Object Name = ''' + convert(varchar,isnull(@UnqualOldName ,'')) + ''''
-- checks that parsename is getting the right name out of your @objname parameter
print 'Table name:'
if @QualName2 is not null
begin
print QuoteName(@QualName2) +'.'+ QuoteName(@QualName1)
select @objid = object_id(QuoteName(@QualName2) +'.'+ QuoteName(@QualName1))
end
else
begin
print QuoteName(@QualName1)
select @objid = object_id(QuoteName(@QualName1))
end
-- check if table is found ok
print 'Table Object ID = ''' + convert(varchar,isnull(@objid ,-1)) + ''''
select @xtype = type from sys.objects where object_id = @objid
print '@xtype = ''' + convert(varchar,isnull(@xtype,'')) + ''' (U or V?)'
if (@xtype in ('U','V'))
begin
print 'select @colid = column_id from sys.columns where object_id = ' +
convert(varchar,isnull(@objid,0)) + ' and name = ''' +
@UnqualOldName + ''''
select * from sys.columns where object_id = @objid -- and name = @UnqualOldName
select @colid = column_id from sys.columns
where object_id = @objid and name = @UnqualOldName
print 'Column ID = ''' + convert(varchar,isnull(@colid,-1)) + ''''
end
Questo stamperà alcuni messaggi utile nella scheda Messaggi (di SSMS o qualsiasi altra cosa si sta utilizzando) e i campi della tabella nella scheda Risultati.
Buona fortuna.
E esclude le parentesi sul nuovo nome (come hai fatto), altrimenti diventano parte del nome – Savage