我有一个查询,我正在编写将一些带有主键的堆表转换为聚簇表,但是我生成的字符串似乎截断了超过一定长度的对象。
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 才能使这些更改生效。