Właśnie spędziłem zbyt wiele czasu próbuje dowiedzieć się, dlaczego tak się dzieje na bazie produkcyjnej mogę dostęp tylko poprzez mylittlesql. Nie udało się odtworzyć problemu, ale utworzyłem skrypt z bitów sp_rename, więc gdy to nastąpi następnym razem, będę mógł dokładnie ustalić, dlaczego. Tak, to przesada, ale może pomóc komuś innemu.
Wystąpił problem, jeśli kiedykolwiek zdołałeś jakoś wprowadzić "[" lub "]" w rzeczywistą nazwę kolumny zapisaną w pliku sys.columns, (? 'Nvarchar' jako twoją nazwę kolumny ????). PARSENAME nie radzi sobie z wartościami [] i zwraca wartość null, więc sp_rename nie będzie działać.
Pomoże to tylko zdiagnozować problem dla „kolumny” przypadku z kodem błędu 15248 czyli tam, gdzie trzymam posiadające ten problem:
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
Wyjście to będzie kilka pomocnych wiadomości w zakładce Wiadomości (z SSMS lub cokolwiek, czego używasz) i pola tabeli na karcie Wyniki.
Powodzenia.
I wyklucz nawiasy klamrowe pod nową nazwą (tak jak to robiłeś), w przeciwnym razie stają się częścią nazwy – Savage