Sql-Server

刪除名稱中包含不可列印字元的表

  • May 8, 2020

我有一個舊表,其名稱包含不可列印的字元(CHAR(31)具體來說是 )。

不可列印的字元在下劃線旁邊,我發現快捷方式CTRL+SHIFT+_創建了CHAR(31)字元(這意味著“美國” - 單位分隔符)。以前的開發人員可能會誤打這個組合,並創建了包含這個奇怪字元的表格。

當我們對錶發出SELECT命令時,它會返回結果。但是當我們嘗試針對它發出任何 DDL(DROPsp_rename等)時,該字元會導致問題。

例子:

DROP TABLE Table_Name;

提高:

消息 15225 - 在目前數據庫“MyDB”中找不到名稱為“Table_Name”的項目,因為 @itemtype 輸入為“(null)”。

EXEC sp_rename N'Table_Name', N'NewTableName'; 

提高:

消息 102 - ‘_Name’ 附近的語法不正確。

我已經用正確的名稱複製了表,並在依賴對像上更正了它。剩下的步驟就是從數據庫中刪除它。

只是一個見解:當我們從 SQL Server 複製+粘貼到 Notepad++ 時,它會在下劃線旁邊的表名中間顯示隱藏字元(“US”):

單位分隔符 (CHAR(31)) 字元

由於您已經知道隱藏了哪個字元,您可以使用變數輕鬆構造目前名稱,將其傳遞給sp_rename,然後使用新獲取的名稱刪除表:

DECLARE @t nvarchar(128) = N'dbo.Table' + NCHAR(31) + N'_Name';
EXEC sys.sp_rename @t, N'NewTableName', N'OBJECT';
DROP TABLE dbo.NewTableName;

(始終小心使用正確的模式標識符。)

更容易的是獲取您知道其中包含字元的字元串,並將其包裝在方括號中。這對我來說很好:

DROP TABLE dbo.[Table_Name];
---------------------^
-- There is an NCHAR(31) right before the underscore

如果您不知道有問題的字元,您可以從目錄視圖中提取名稱,通過周圍的字元來辨識它,然後遍歷字元以確定哪些是有問題的。這是一個完整的複製品:

USE tempdb;
GO

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'CREATE TABLE dbo.[Table' + NCHAR(31) + N'_Name](ID INT);';
EXEC sys.sp_executesql @sql;
GO

DECLARE @var NVARCHAR(128);
SELECT @var = name 
 FROM sys.tables 
 WHERE name LIKE N'Table%Name';

-- is it the right one?
PRINT @var;

DECLARE @i INT;
SET @i = 1;
WHILE @i <= LEN(@var)
BEGIN
 PRINT SUBSTRING(@var, @i, 1) + N' => ' + RTRIM(UNICODE(SUBSTRING(@var, @i, 1)));
 SET @i = @i + 1;
END

結果:

Table_Name
T => 84
a => 97
b => 98
l => 108
e => 101
=> 31
_ => 95
N => 78
a => 97
m => 109
e => 101

然後不要忘記斥責或打擊最初以這種方式進入系統的桌子負責人,如果他們仍在該行業中工作的話。

引用自:https://dba.stackexchange.com/questions/115652