[FIXED] Abrufen von Tabellen basierend auf COL_LENGTH in SQL Server

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_lengthes doppelt ist, wenn der Typ nchar, nvarchar, usw. ist, aber es sollte für Vergleichszwecke keine Rolle spielen (weil ein Unterschied nur zwischen varchar/ nvarcharoder sogar nchar/ nvarcharimmer 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like