Sql-Server
刪除名稱中包含不可列印字元的表
我有一個舊表,其名稱包含不可列印的字元(
CHAR(31)
具體來說是 )。不可列印的字元在下劃線旁邊,我發現快捷方式
CTRL+SHIFT+_
創建了CHAR(31)
字元(這意味著“美國” - 單位分隔符)。以前的開發人員可能會誤打這個組合,並創建了包含這個奇怪字元的表格。當我們對錶發出
SELECT
命令時,它會返回結果。但是當我們嘗試針對它發出任何 DDL(DROP
、sp_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”):
由於您已經知道隱藏了哪個字元,您可以使用變數輕鬆構造目前名稱,將其傳遞給
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
然後不要忘記斥責或打擊最初以這種方式進入系統的桌子負責人,如果他們仍在該行業中工作的話。