Ausgabe
Ich versuche, ein Abfragedesign zu erstellen , das meine gesamte Datenbank durchsuchen und identifizieren kann, welche Tabellen meine beiden Spalten enthalten (z . Dies ist das folgende Design, das ich erstellt habe, aber SQL würde es nicht als ” Methoden auf nvarchar kann nicht aufgerufen werden ” verarbeiten.
SELECT SUBQUERY.TABLE_NAME
FROM
(
SELECT
TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES T
WHERE
T.TABLE_CATALOG = 'DB_Name' AND
T.TABLE_TYPE = 'BASE TABLE'
AND EXISTS (
SELECT T.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE
C.TABLE_CATALOG = T.TABLE_CATALOG AND
C.TABLE_SCHEMA = T.TABLE_SCHEMA AND
C.TABLE_NAME = T.TABLE_NAME AND
C.COLUMN_NAME = 'Column_1')
AND EXISTS
(
SELECT T.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE
C.TABLE_CATALOG = T.TABLE_CATALOG AND
C.TABLE_SCHEMA = T.TABLE_SCHEMA AND
C.TABLE_NAME = T.TABLE_NAME AND
C.COLUMN_NAME = 'Column_2')
) AS SUBQUERY
WHERE
COL_LENGTH(SUBQUERY.TABLE_NAME.Column_1, 'Len_Column_1') != COL_LENGTH(SUBQUERY.TABLE_NAME.Column_2, 'Len_Column_2')
Lösung
Ich würde einfach neu anfangen und gar nicht verwenden INFORMATION_SCHEMA
.
SELECT [table] = t.name,
c1name = c1.name,
c1type = concat(type_name(c1.system_type_id), '(', c1.max_length, ')'),
c2name = c2.name,
c2type = concat(type_name(c2.system_type_id), '(', c2.max_length, ')')
FROM sys.tables AS t
INNER JOIN sys.columns AS c1 ON t.[object_id] = c1.[object_id]
INNER JOIN sys.columns AS c2 ON t.[object_id] = c2.[object_id]
WHERE c1.name = N'column_1'
AND c2.name = N'column_2'
AND (c1.system_type_id <> c2.system_type_id
OR c1.max_length <> c2.max_length);
Hier ist eine Beispielgeige .
Beachten Sie, dass max_length
es doppelt ist, wenn der Typ nchar
, nvarchar
, usw. ist, aber es sollte für Vergleichszwecke keine Rolle spielen (weil ein Unterschied nur zwischen varchar
/ nvarchar
oder sogar nchar
/ nvarchar
immer noch hervorgehoben werden sollte). Es spielt auch keine Rolle für max
– das sind beide -1
, aber es würde immer noch von dieser Abfrage zurückgegeben werden, wenn einer war varchar(max)
und der andere war nvarchar(max)
.
Beantwortet von – Rhythmus war ein Lurker
Antwort geprüft von – Clifford M. (FixError Volunteer)