2015-10-09 8 views
0

У меня есть эта проблема, которую я пытался исправить в течение нескольких часов, в основном у меня есть код SQL, который печатает таблицы в базе данных и их столбцах вместе с некоторыми другая информация, которая выглядит следующим образом: What I getСлияние столбца под конкретными критериями в sql sever 2014

проблема заключается в том, что я хочу удалить дубликаты в первой колонке, которая показывает имя таблицы, но я хочу оставить атрибут «столбцы» в разных строках, в основном мне нужны дубликаты стать пустым или слить первый столбец строк, которые представляют одну и ту же таблицу. Я знаю, что это широкое объяснение, но это то, что я хочу, чтобы это выглядело как: wanted result

это код SQL Я использую под SQL SERVER 2014:

SELECT CAST(t.NAME AS CHAR(12)) AS [Table] 
,CAST(c.NAME AS CHAR(20)) AS [Column] 
,CAST(d.NAME AS CHAR(9)) AS [Data type] 
,CASE 
    WHEN d.NAME IN (
      'char' 
      ,'varchar' 
      ) 
     THEN STR(c.max_length, 6, 0) 
    ELSE '' 
    END AS [Length] 
,CASE 
    WHEN d.NAME IN (
      'numeric' 
      ,'decimal' 
      ) 
     THEN STR(c.precision, 9, 0) 
    ELSE '' 
    END AS [Precision] 
,CASE 
    WHEN d.NAME IN (
      'numeric' 
      ,'decimal' 
      ) 
     THEN STR(c.scale, 5, 0) 
    ELSE '' 
    END AS [Scale] 
,CASE c.is_nullable 
    WHEN 0 
     THEN 'not null' 
    ELSE '' 
    END AS [Nullable] 
FROM sys.columns AS c 
JOIN sys.tables AS t ON c.object_id = t.object_id 
JOIN sys.types AS d ON c.system_type_id = d.system_type_id 
ORDER BY 1 
    ,column_id; 

Код должен работать для любой базы данных под sql server 2008 и более. Спасибо за помощь.

ответ

0

Это должно работать;

WITH CTE 
AS (
    SELECT ROW_NUMBER() OVER (
      PARTITION BY t.NAME ORDER BY c.NAME 
      ) AS ID 
     ,CAST(t.NAME AS CHAR(12)) AS [Table] 
     ,CAST(c.NAME AS CHAR(20)) AS [Column] 
     ,CAST(d.NAME AS CHAR(9)) AS [Data type] 
     ,CASE 
      WHEN d.NAME IN (
        'char' 
        ,'varchar' 
        ) 
       THEN STR(c.max_length, 6, 0) 
      ELSE '' 
      END AS [Length] 
     ,CASE 
      WHEN d.NAME IN (
        'numeric' 
        ,'decimal' 
        ) 
       THEN STR(c.precision, 9, 0) 
      ELSE '' 
      END AS [Precision] 
     ,CASE 
      WHEN d.NAME IN (
        'numeric' 
        ,'decimal' 
        ) 
       THEN STR(c.scale, 5, 0) 
      ELSE '' 
      END AS [Scale] 
     ,CASE c.is_nullable 
      WHEN 0 
       THEN 'not null' 
      ELSE '' 
      END AS [Nullable] 
    FROM sys.columns AS c 
    JOIN sys.tables AS t ON c.object_id = t.object_id 
    JOIN sys.types AS d ON c.system_type_id = d.system_type_id 
    ) 
SELECT CASE 
     WHEN ct.ID = 1 
      THEN ct.[Table] 
     ELSE '' 
     END AS 'Table' 
    ,ct.[Column] 
    ,ct.[Data type] 
    ,ct.Length 
    ,ct.Precision 
    ,ct.Scale 
    ,ct.Nullable 
FROM CTE ct 
+0

отлично работает благодаря! –