2016-10-03 32 views
-2

我正在修改mssqltips.com中的脚本,该脚本生成脚本以重新创建数据库中的所有索引。我将它放在TRY中,CATCH将调用一个存储过程并传递它5个参数。其中之一,c.name旨在成为父表的主键,但引发“多部分标识符”c.name“无法绑定”。错误。对于代码的长期使用感到抱歉,但认为它看起来很重要。 enter image description hereSQL:多部分标识符“c.name”无法绑定

我发布了一个图像,因为SQL非常大,并认为语法高亮会有帮助。这是我现在在哪里。

SELECT @create += N'BEGIN TRY ALTER TABLE ' + QUOTENAME(cs.name) + '.' + QUOTENAME(ct.name) + ' ADD CONSTRAINT ' + QUOTENAME(fk.name) + ' FOREIGN KEY (' + STUFF((SELECT ',' + QUOTENAME(c.name) 
FROM sys.columns AS c 
    INNER JOIN sys.foreign_key_columns AS fkc ON fkc.parent_column_id = c.column_id AND fkc.parent_object_id = c.[object_id] 
WHERE fkc.constraint_object_id = fk.[object_id] 
ORDER BY fkc.constraint_column_id 
FOR XML PATH(N''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 1, N'') + ') REFERENCES ' + QUOTENAME(rs.name) + '.' + QUOTENAME(rt.name) + '(' + STUFF((SELECT ',' + QUOTENAME(sc.name) 
FROM sys.columns AS sc 
INNER JOIN sys.foreign_key_columns AS fkc ON fkc.referenced_column_id = sc.column_id AND fkc.referenced_object_id = sc.[object_id] 
WHERE fkc.constraint_object_id = fk.[object_id] 
ORDER BY fkc.constraint_column_id 
FOR XML PATH(N''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 1, N'') + '); END TRY BEGIN CATCH EXEC pr_purged_orphaned ' 
    + QUOTENAME(ct.name) + ' , ' + QUOTENAME(fk.name) + ' , ' + QUOTENAME(c.name) + ' , ' + QUOTENAME(rt.name) + ' , ''_cID_project_''' FROM sys.foreign_keys AS fk 
INNER JOIN sys.tables AS rt ON fk.referenced_object_id = rt.[object_id] 
INNER JOIN sys.schemas AS rs ON rt.[schema_id] = rs.[schema_id] 
INNER JOIN sys.tables AS ct ON fk.parent_object_id = ct.[object_id] 
INNER JOIN sys.schemas AS cs ON ct.[schema_id] = cs.[schema_id] WHERE rt.is_ms_shipped = 0 AND ct.is_ms_shipped = 0; 
+2

你应该发布你的实际查询,而不仅仅是它的图像。但是,最后一次引用'quotename(c.name)'的'from'语句中不包含'sys_columns' ... – sgeddes

+1

发布SQL语句的*图像*(屏幕截图)几乎是无用的。 – spencer7593

回答

0

在内联查询中没有包含'c'作为别名的对象。这就是得到这个错误的原因。如果你想获得列名,那么使用'sc.name'而不是'c.name'。

+0

我其实已经尝试过,结果相同。奇怪的是,我可以引用rt.name,ct.name&fk.name而不存在问题。 – Dan

+0

你可以放置你的实际代码而不是图像吗? –

0

但正如其他人所指出的,我的内联查询中没有别名。一旦我将代码格式化了,我就可以看到它。将sys.columns加入sys.tables将解决该问题。

相关问题