T-Sql

連接的字元串被截斷

  • October 7, 2020

我有一個查詢,我正在編寫將一些帶有主鍵的堆表轉換為聚群表,但是我生成的字元串似乎截斷了超過一定長度的對象。

SELECT 
   --t.name,
--   t.schema_id,
--   t.type,
--   t.type_desc,
--   i.name,
--   i.type,
--   i.type_desc,
--   i.is_primary_key,
   --c.name,
   'print ''dropping index on dbo.' + CAST(t.name AS VARCHAR(MAX)) + ''';' + CAST(CHAR(10) AS VARCHAR(MAX)) + CAST(CHAR(13) AS VARCHAR(MAX))  + 
   'drop index ' + CAST(i.name AS VARCHAR(MAX)) + ' on dbo.' + CAST(t.name AS VARCHAR(MAX)) + ';' + CAST(CHAR(10) AS VARCHAR(MAX)) + CAST(CHAR(13) AS VARCHAR(MAX)) +
   'go' + CAST(CHAR(10) AS VARCHAR(MAX)) + CAST(CHAR(13) AS VARCHAR(MAX)) +
   'print ''creating clustered primary key on dbo.' + CAST(t.name AS VARCHAR(MAX)) + ''';' + CAST(CHAR(10) AS VARCHAR(MAX)) + CAST(CHAR(13) AS VARCHAR(MAX)) +
   'alter table dbo.' + CAST(t.name AS VARCHAR(MAX)) + ' add constraint ' + CAST(i.name AS VARCHAR(MAX)) + ' primary key clustered (' + CAST(c.name AS VARCHAR(MAX)) + ');'
FROM sys.tables t
   INNER JOIN sys.indexes i
       ON i.object_id = t.object_id
   INNER JOIN sys.index_columns ic
       ON i.object_id = ic.object_id
           AND i.index_id = ic.index_id
   INNER JOIN sys.columns c
       ON t.object_id = c.object_id
           AND ic.index_column_id = c.column_id
WHERE i.type = 2
   AND t.object_id NOT IN
(
   SELECT distinct t.object_id AS tableid
   FROM sys.tables t
       INNER JOIN sys.indexes i
           ON t.object_id = i.object_id
   WHERE i.type  = 1
)
ORDER BY t.name,
   i.index_id

如您所見,我嘗試將我正在使用的所有列包裝在 cast 語句中,但它沒有幫助。我不確定為什麼這不起作用。

完整程式碼範例:

print 'dropping index on dbo.Account';

drop index PK_Account on dbo.Account;

go

print 'creating clustered primary key on dbo.Account';

alter table dbo.Account add constraint PK_Account primary key clustered (Id);

截斷程式碼範例:

drop index PK_ALongerTableNameABC on dbo.ALongerTableNameABC;

go

print 'creating clustered primary key on dbo. ALongerTableNameABC';

alter table dbo.ALongerTableNameABC add constraint PK_ALongerTableNa

我通過使用 Results to Text 執行查詢來獲取生成的程式碼。

原因是預設結果到文本選項的最大顯示字元數設置為 256 個字元。這就是文本輸出的其餘部分被截斷的原因。

嘗試 Grid 的結果,你應該是一個快樂的露營者 :-)

所以我找到了兩種方法來解決這個問題,@FlogDonkey 讓我走上了正確的道路。

對於顯示的最大字元,有一個“結果到文本”選項,我將其從 256 覆蓋到 1000 並且它有效。

我還發現在結果到網格中,您可以將其設置為在復製或保存時保留 CR/LF。

但是,我確實必須重新啟動 SSMS 才能使這些更改生效。

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