2016-10-03 3 views
-2

Ich ändere ein Skript von mssqltips.com, das ein Skript zur Wiederherstellung aller Indizes in einer Datenbank generiert. Ich füge es in ein TRY ein und der CATCH wird einen gespeicherten Proc aufrufen und ihm 5 Argumente übergeben. Einer von ihnen, c.name, soll der Primärschlüssel der Elterntabelle sein, wirft aber den "Mehrteiligen Bezeichner" c.name "konnte nicht gebunden werden". Error. Entschuldigung für die Langlebigkeit des Codes, aber ich denke, es könnte relevant sein, alles zu sehen. SQL: mehrteilige Kennung "c.name" konnte nicht gebunden werden

Ich postete ein Bild, da das SQL ziemlich groß war und dachte, die Syntaxhervorhebung wäre hilfreich. Hier bin ich jetzt.

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

Sie sollten Ihre eigentliche Abfrage, nicht nur ein Bild davon. Ihr letzter Verweis auf 'quoteename (c.name)' enthält jedoch 'sys_columns' nicht in der 'from'-Klausel ... – sgeddes

+1

Das Posten eines * Bildes * (Screenshot) einer SQL-Anweisung ist ziemlich nutzlos. – spencer7593

Antwort

0

Es gibt kein Objekt mit 'c' als Alias ​​in Ihrer Inline-Abfrage. Das ist der Grund für diesen Fehler. Wenn Sie den Spaltennamen erhalten wollten, verwenden Sie 'sc.name' anstelle von 'c.name'.

+0

Das habe ich eigentlich schon mit dem gleichen Ergebnis ausprobiert. Was seltsam ist, kann ich rt.name, ct.name & fk.name ohne ein Problem referenzieren. – Dan

+0

können Sie Ihren tatsächlichen Code anstelle des Bildes setzen? –

0

Aber wie andere angegeben haben, habe ich keinen c-Alias ​​in meiner Inline-Abfrage. Sobald ich den Code formatiert hatte, konnte ich das sehen. Durch das Hinzufügen von sys.columns zu sys.tables wird das Problem behoben.

Verwandte Themen