Найти столбцы идентификации из другой базы данных - PullRequest
2 голосов
/ 07 апреля 2011

Обычно с SQL Server вы можете использовать функцию COLUMNPROPERTY, например, чтобы найти столбцы Identity в базе данных:

select TABLE_NAME + '.' + COLUMN_NAME, TABLE_NAME 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_SCHEMA = 'dbo' 
and COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 
order by TABLE_NAME 

Но я не могу понять, как заставить это работать при запускезапрос из другой базы данных.Например, это не возвращает никаких результатов:

Use FirstDatabase
Go

select TABLE_NAME + '.' + COLUMN_NAME, TABLE_NAME 
from SecondDatabase.INFORMATION_SCHEMA.COLUMNS 
where TABLE_SCHEMA = 'dbo' 
and COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 
order by TABLE_NAME 

Ответы [ 4 ]

2 голосов
/ 28 февраля 2014

Нет способа получить информацию с помощью COLUMNPROPERTY из другой базы данных.Но есть обходной путь:

DECLARE @DatabaseName VARCHAR(MAX)
DECLARE @TableName VARCHAR(MAX)
DECLARE @SQL VARCHAR(MAX)

SET @DatabaseName = 'MyDatabase'
SET @TableName = 'MyTable'

SET @SQL = '
SELECT 
    C.TABLE_NAME,
    C.COLUMN_NAME,
    S.IS_IDENTITY
FROM ' + @DatabaseName + '.INFORMATION_SCHEMA.COLUMNS AS C
LEFT JOIN ' + @DatabaseName + '.SYS.COLUMNS AS S ON OBJECT_ID(''' + @DatabaseName + '.dbo.' + @TableName + ''') = S.OBJECT_ID AND C.COLUMN_NAME = S.NAME
WHERE S.IS_IDENTITY = 1'

EXEC(@SQL)
2 голосов
/ 07 апреля 2011

Object_ID работает только в текущем дБ, если вы не используете имя из 3 частей, но эта форма сложна в использовании. Кроме того, ColumnProperty работает только в текущей базе данных.

select o.name + '.' + c.name, o.name
from test1.sys.columns c
join test1.sys.objects o on c.object_id = o.object_id
join test1.sys.schemas s on s.schema_id = o.schema_id
where s.name = 'dbo'
  and o.is_ms_shipped = 0 and o.type = 'U'
  and c.is_identity = 1
order by o.name
1 голос
/ 30 августа 2013

Это сработало для меня, используя конкретную базу данных:

USE <database_name>;
GO
SELECT SCHEMA_NAME(schema_id) AS schema_name
    , t.name AS table_name
    , c.name AS column_name
FROM sys.tables AS t
JOIN sys.identity_columns c ON t.object_id = c.object_id
ORDER BY schema_name, table_name;
GO
0 голосов
/ 21 сентября 2016

В этом примере я построил хранимую процедуру в «Database1», которая использует динамический SQL для извлечения информации о столбцах из таблицы в «Database2» (используя системное представление [INFORMATION_SCHEMA]. [COLUMNS], находящееся в «Database2»). ):

ALTER PROCEDURE [Database1].[Schema1].[ColumnNames] @Database2 nvarchar(128), @Schema2 nvarchar(128), @Table2 nvarchar(128)
AS

BEGIN
    DECLARE @Sql nvarchar(1000)

    SET @Sql = 'SELECT [COLUMN_NAME], [ORDINAL_POSITION] FROM [' + @Database2 + '].[INFORMATION_SCHEMA].[COLUMNS]
                WHERE [TABLE_SCHEMA] = ''' + @Schema2 + ''' AND [TABLE_NAME] = ''' + @Table2 + ''''
    EXEC(@Sql)
END 
...