[SQL] SQL 서버의 모든 데이터베이스의 모든 테이블에 대한 열 이름을 찾는 방법
SQLSQL 서버의 모든 데이터베이스의 모든 테이블에 대한 열 이름을 찾는 방법
나는 모든 데이터베이스의 모든 테이블의 모든 열 이름을 찾고 싶어요. 나를 위해 그렇게 할 수있는 쿼리가 있습니까? 데이터베이스는 마이크로 소프트 SQL 서버 2000입니다.
해결법
-
==============================
1.이 시도:
이 시도:
select o.name,c.name from sys.columns c inner join sys.objects o on c.object_id=o.object_id order by o.name,c.column_id
결과 열 이름이 될 것이다 :
select o.name as [Table], c.name as [Column] from sys.columns c inner join sys.objects o on c.object_id=o.object_id --where c.name = 'column you want to find' order by o.name,c.name
또는 자세한 내용에 대한 :
SELECT s.name as ColumnName ,sh.name+'.'+o.name AS ObjectName ,o.type_desc AS ObjectType ,CASE WHEN t.name IN ('char','varchar') THEN t.name+'('+CASE WHEN s.max_length<0 then 'MAX' ELSE CONVERT(varchar(10),s.max_length) END+')' WHEN t.name IN ('nvarchar','nchar') THEN t.name+'('+CASE WHEN s.max_length<0 then 'MAX' ELSE CONVERT(varchar(10),s.max_length/2) END+')' WHEN t.name IN ('numeric') THEN t.name+'('+CONVERT(varchar(10),s.precision)+','+CONVERT(varchar(10),s.scale)+')' ELSE t.name END AS DataType ,CASE WHEN s.is_nullable=1 THEN 'NULL' ELSE 'NOT NULL' END AS Nullable ,CASE WHEN ic.column_id IS NULL THEN '' ELSE ' identity('+ISNULL(CONVERT(varchar(10),ic.seed_value),'')+','+ISNULL(CONVERT(varchar(10),ic.increment_value),'')+')='+ISNULL(CONVERT(varchar(10),ic.last_value),'null') END +CASE WHEN sc.column_id IS NULL THEN '' ELSE ' computed('+ISNULL(sc.definition,'')+')' END +CASE WHEN cc.object_id IS NULL THEN '' ELSE ' check('+ISNULL(cc.definition,'')+')' END AS MiscInfo FROM sys.columns s INNER JOIN sys.types t ON s.system_type_id=t.user_type_id and t.is_user_defined=0 INNER JOIN sys.objects o ON s.object_id=o.object_id INNER JOIN sys.schemas sh on o.schema_id=sh.schema_id LEFT OUTER JOIN sys.identity_columns ic ON s.object_id=ic.object_id AND s.column_id=ic.column_id LEFT OUTER JOIN sys.computed_columns sc ON s.object_id=sc.object_id AND s.column_id=sc.column_id LEFT OUTER JOIN sys.check_constraints cc ON s.object_id=cc.parent_object_id AND s.column_id=cc.parent_column_id ORDER BY sh.name+'.'+o.name,s.column_id
편집하다 여기에 모든 데이터베이스의 모든 열을 얻을 수있는 기본적인 예입니다 :
DECLARE @SQL varchar(max) SET @SQL='' SELECT @SQL=@SQL+'UNION select '''+d.name+'.''+sh.name+''.''+o.name,c.name,c.column_id from '+d.name+'.sys.columns c inner join '+d.name+'.sys.objects o on c.object_id=o.object_id INNER JOIN '+d.name+'.sys.schemas sh on o.schema_id=sh.schema_id ' FROM sys.databases d SELECT @SQL=RIGHT(@SQL,LEN(@SQL)-5)+'order by 1,3' --print @SQL EXEC (@SQL)
편집 SQL 서버 2000 버전
DECLARE @SQL varchar(8000) SET @SQL='' SELECT @SQL=@SQL+'UNION select '''+d.name+'.''+sh.name+''.''+o.name,c.name,c.colid from '+d.name+'..syscolumns c inner join sysobjects o on c.id=o.id INNER JOIN sysusers sh on o.uid=sh.uid ' FROM master.dbo.sysdatabases d SELECT @SQL=RIGHT(@SQL,LEN(@SQL)-5)+'order by 1,3' --print @SQL EXEC (@SQL)
편집하다 몇 가지 의견을 바탕으로, 여기 sp_MSforeachdb를 사용하여 버전입니다 :
sp_MSforeachdb 'select ''?'' AS DatabaseName, o.name AS TableName,c.name AS ColumnName from sys.columns c inner join ?.sys.objects o on c.object_id=o.object_id --WHERE ''?'' NOT IN (''master'',''msdb'',''tempdb'',''model'') order by o.name,c.column_id'
-
==============================
2.왜 사용하지 않을
왜 사용하지 않을
Select * From INFORMATION_SCHEMA.COLUMNS
당신은과 특정을 DB를 만들 수 있습니다
Select * From DBNAME.INFORMATION_SCHEMA.COLUMNS
-
==============================
3.
SELECT * FROM information_schema.columns WHERE column_name = 'My_Column'
이 쿼리 전에 사용 [DB_NAME]와 현재 데이터베이스의 이름을 설정해야합니다.
-
==============================
4.당신을 위해 더 나은 방법
당신을 위해 더 나은 방법
sp_MSForEachDB @command1='USE ?; SELECT Table_Catalog ,Table_Schema ,Table_Name ,Column_Name ,Data_Type ,Character_Maximum_Length FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME like ''%ColumnNameHere%'''
-
==============================
5.일반적으로 나는 커서의 사용을 피하기 위해해야 할 무엇이든 내가 할 수있는 노력하지만, 다음 쿼리는 당신에게 당신이 필요한 모든 것을 얻을 것이다 :
일반적으로 나는 커서의 사용을 피하기 위해해야 할 무엇이든 내가 할 수있는 노력하지만, 다음 쿼리는 당신에게 당신이 필요한 모든 것을 얻을 것이다 :
--Declare/Set required variables DECLARE @vchDynamicDatabaseName AS VARCHAR(MAX), @vchDynamicQuery As VARCHAR(MAX), @DatabasesCursor CURSOR SET @DatabasesCursor = Cursor FOR --Select * useful databases on the server SELECT name FROM sys.databases WHERE database_id > 4 ORDER by name --Open the Cursor based on the previous select OPEN @DatabasesCursor FETCH NEXT FROM @DatabasesCursor INTO @vchDynamicDatabaseName WHILE @@FETCH_STATUS = 0 BEGIN --Insert the select statement into @DynamicQuery --This query will select the Database name, all tables/views and their columns (in a comma delimited field) SET @vchDynamicQuery = ('SELECT ''' + @vchDynamicDatabaseName + ''' AS ''Database_Name'', B.table_name AS ''Table Name'', STUFF((SELECT '', '' + A.column_name FROM ' + @vchDynamicDatabaseName + '.INFORMATION_SCHEMA.COLUMNS A WHERE A.Table_name = B.Table_Name FOR XML PATH(''''),TYPE).value(''(./text())[1]'',''NVARCHAR(MAX)'') , 1, 2, '''') AS ''Columns'' FROM ' + @vchDynamicDatabaseName + '.INFORMATION_SCHEMA.COLUMNS B WHERE B.TABLE_NAME LIKE ''%%'' AND B.COLUMN_NAME LIKE ''%%'' GROUP BY B.Table_Name Order BY 1 ASC') --Print @vchDynamicQuery EXEC(@vchDynamicQuery) FETCH NEXT FROM @DatabasesCursor INTO @vchDynamicDatabaseName END CLOSE @DatabasesCursor DEALLOCATE @DatabasesCursor GO
나는 메인 쿼리에 WHERE 절을 추가 (예 : B.TABLE_NAME LIKE '%%' 'AND B.COLUMN_NAME LIKE'%% '') 그래서 당신이 원하는 경우 특정 테이블 및 / 또는 열을 검색 할 수 있음 .
-
==============================
6.사용자 @KM 가장 대답을 말한다.
사용자 @KM 가장 대답을 말한다.
내가 사용이 :
Declare @Table_Name VarChar(100) ,@Column_Name VarChar(100) Set @Table_Name = '' Set @Column_Name = '' Select RowNumber = Row_Number() Over( PARTITION BY T.[Name] Order By T.[Name],C.column_id ), SCHEMA_NAME( T.schema_id ) As SchemaName , T.[Name] As Table_Name , C.[Name] As Field_Name , sysType.name , C.max_length , C.is_nullable , C.is_identity , C.scale , C.precision From Sys.Tables As T Left Join Sys.Columns As C On ( T.[Object_Id] = C.[Object_Id] ) Left Join sys.types As sysType On ( C.user_type_id = sysType.user_type_id ) Where ( Type = 'U' ) And ( C.Name Like '%' + @Column_Name + '%' ) And ( T.Name Like '%' + @Table_Name + '%' )
-
==============================
7.모든 사람 : 포스트와 댓글 모두 감사합니다 좋은 있지만, 일부는 더 낫다.
모든 사람 : 포스트와 댓글 모두 감사합니다 좋은 있지만, 일부는 더 낫다.
이 필요한 단지 무엇을 제공하기 때문에 첫 번째 큰 스크립트는 좋다. 가장 빠르고 상세하게는 INFORMATION_SCHEMA.COLUMNS에서 선택하는 하나 개의 제안입니다 ..
내 필요가 내가 스크립트 작업 아래 두 가지 중 하나 (아래 참조) 모두 내 버전을 만든 초에 상품을 제공, 거의 동일한 이름과 여러 데이터베이스 .. SOOO의 모든 잘못된 열을 찾는 것이 었습니다.
이 링크의 다른 게시물에 가정은, 첫 번째 코드 예제가-각 데이터베이스, 나에게, 바람직하지 않다 성공적으로 사용될 수 있다는 것입니다. 이 정보는 특정 데이터베이스와 "fedb"의 단순한 사용 내에 있기 때문에, 단순히 액세스 권한을 부여하지 않는 올바른 결과를 생성하지 않습니다이다. 나는 데이터베이스를 수집하고,이 경우, 유틸리티 스크립트, 그것은 같은 좋은 사용하는 것입니다 오프 라인을있는 그 사람들을 무시 커서를 사용하는 이유 SOOO 그것입니다.
결론, 나는 게시물의 모든 보정을 통합하고 다른 좋은 작품에서 두 개의 매우 설득력 스크립트가 무엇 만든 사람의 게시물을 읽을. 나는 아래에 모두 나열되고 또한이 링크에 액세스 할 수있는 OneDrive.com에서 내 공용 폴더에 스크립트 파일에 놓여있다 : http://1drv.ms/1vr8yNX
즐겨 ! 행크 프리먼
별도로 시도 ...
--------------------------- --- 1st example (works) --- --------------------------- Declare @DBName sysname ,@SQL_String1 nvarchar(4000) ,@SQL_String2 nvarchar(4000) ,@ColumnName nvarchar(200) --set @ColumnName = 'Course_ID' -------- Like Trick -------- -- IF you want to add more the @ColumnName so it looks like Course_ID,CourseID -- then add an additional pairing of +''','''+'NewColumnSearchIDValue' ---------------------------- set @ColumnName = 'Course_ID' +''','''+'CourseID' --select @ColumnName ----- Declare @Column_Info table ( [DatabaseName] nvarchar(128) NULL, [ColumnName] sysname NULL, [ObjectName] nvarchar(257) NOT NULL, [ObjectType] nvarchar(60) NULL, [DataType] nvarchar(151) NULL, [Nullable] varchar(8) NOT NULL, [MiscInfo] nvarchar(MAX) NOT NULL ) -------------- Begin set @SQL_String2 = 'SELECT DB_NAME() as ''DatabaseName'', s.name as ColumnName ,sh.name+''.''+o.name AS ObjectName ,o.type_desc AS ObjectType ,CASE WHEN t.name IN (''char'',''varchar'') THEN t.name+''(''+CASE WHEN s.max_length<0 then ''MAX'' ELSE CONVERT(varchar(10),s.max_length) END+'')'' WHEN t.name IN (''nvarchar'',''nchar'') THEN t.name+''(''+CASE WHEN s.max_length<0 then ''MAX'' ELSE CONVERT(varchar(10),s.max_length/2) END+'')'' WHEN t.name IN (''numeric'') THEN t.name+''(''+CONVERT(varchar(10),s.precision)+'',''+CONVERT(varchar(10),s.scale)+'')'' ELSE t.name END AS DataType ,CASE WHEN s.is_nullable=1 THEN ''NULL'' ELSE ''NOT NULL'' END AS Nullable ,CASE WHEN ic.column_id IS NULL THEN '''' ELSE '' identity(''+ISNULL(CONVERT(varchar(10),ic.seed_value),'''')+'',''+ISNULL(CONVERT(varchar(10),ic.increment_value),'''')+'')=''+ISNULL(CONVERT(varchar(10),ic.last_value),''null'') END +CASE WHEN sc.column_id IS NULL THEN '''' ELSE '' computed(''+ISNULL(sc.definition,'''')+'')'' END +CASE WHEN cc.object_id IS NULL THEN '''' ELSE '' check(''+ISNULL(cc.definition,'''')+'')'' END AS MiscInfo into ##Temp_Column_Info FROM sys.columns s INNER JOIN sys.types t ON s.system_type_id=t.user_type_id and t.is_user_defined=0 INNER JOIN sys.objects o ON s.object_id=o.object_id INNER JOIN sys.schemas sh on o.schema_id=sh.schema_id LEFT OUTER JOIN sys.identity_columns ic ON s.object_id=ic.object_id AND s.column_id=ic.column_id LEFT OUTER JOIN sys.computed_columns sc ON s.object_id=sc.object_id AND s.column_id=sc.column_id LEFT OUTER JOIN sys.check_constraints cc ON s.object_id=cc.parent_object_id AND s.column_id=cc.parent_column_id -------------------------------------------- --- DBA - Hank 12-Feb-2015 added this specific where statement -- where Upper(s.name) like ''COURSE%'' -- where Upper(s.name) in (''' + @ColumnName + ''') -- where Upper(s.name) in (''cycle_Code'') -- ORDER BY sh.name+''.''+o.name,s.column_id order by 1,2' -------------------- Declare DB_cursor CURSOR FOR SELECT name FROM sys.databases --select * from sys.databases WHERE STATE = 0 -- and Name not IN ('master','msdb','tempdb','model','DocxPress') and Name not IN ('msdb','tempdb','model','DocxPress') Open DB_cursor Fetch next from DB_cursor into @DBName While @@FETCH_STATUS = 0 begin --select @DBName as '@DBName'; Set @SQL_String1 = 'USE [' + @DBName + ']' set @SQL_String1 = @SQL_String1 + @SQL_String2 EXEC sp_executesql @SQL_String1; -- insert into @Column_Info select * from ##Temp_Column_Info; drop table ##Temp_Column_Info; Fetch next From DB_cursor into @DBName end CLOSE DB_cursor; Deallocate DB_cursor; --- select * from @Column_Info order by 2,3 ---------------------------- end --------------------------- Below is the Second script.. --------------------------- --- 2nd example (works) --- --------------------------- -- This is by far the best/fastes of the lot for what it delivers. --Select * into dbo.hanktst From Master.INFORMATION_SCHEMA.COLUMNS --FileID: SCRIPT_Get_Column_info_(INFORMATION_SCHEMA.COLUMNS).sql ---------------------------------------- --FileID: SCRIPT_Get_Column_info_(INFORMATION_SCHEMA.COLUMNS).sql -- Utility to find all columns in all databases or find specific with a like statement -- Look at this line to find a: --> set @SQL_String2 = ' select * into ##Temp_Column_Info.... ---------------------------------------- --- SET NOCOUNT ON begin Declare @hanktst TABLE ( [TABLE_CATALOG] NVARCHAR(128) NULL ,[TABLE_SCHEMA] NVARCHAR(128) NULL ,[TABLE_NAME] sysname NOT NULL ,[COLUMN_NAME] sysname NULL ,[ORDINAL_POSITION] INT NULL ,[COLUMN_DEFAULT] NVARCHAR(4000) NULL ,[IS_NULLABLE] VARCHAR(3) NULL ,[DATA_TYPE] NVARCHAR(128) NULL ,[CHARACTER_MAXIMUM_LENGTH] INT NULL ,[CHARACTER_OCTET_LENGTH] INT NULL ,[NUMERIC_PRECISION] TINYINT NULL ,[NUMERIC_PRECISION_RADIX] SMALLINT NULL ,[NUMERIC_SCALE] INT NULL ,[DATETIME_PRECISION] SMALLINT NULL ,[CHARACTER_SET_CATALOG] sysname NULL ,[CHARACTER_SET_SCHEMA] sysname NULL ,[CHARACTER_SET_NAME] sysname NULL ,[COLLATION_CATALOG] sysname NULL ,[COLLATION_SCHEMA] sysname NULL ,[COLLATION_NAME] sysname NULL ,[DOMAIN_CATALOG] sysname NULL ,[DOMAIN_SCHEMA] sysname NULL ,[DOMAIN_NAME] sysname NULL ) Declare @DBName sysname ,@SQL_String2 nvarchar(4000) ,@TempRowCnt varchar(20) ,@Dbug bit = 0 Declare DB_cursor CURSOR FOR SELECT name FROM sys.databases WHERE STATE = 0 -- and Name not IN ('master','msdb','tempdb','model','DocxPress') and Name not IN ('msdb','tempdb','model','DocxPress') Open DB_cursor Fetch next from DB_cursor into @DBName While @@FETCH_STATUS = 0 begin set @SQL_String2 = ' select * into ##Temp_Column_Info from [' + @DBName + '].INFORMATION_SCHEMA.COLUMNS where UPPER(Column_Name) like ''COURSE%'' ;' if @Dbug = 1 Select @SQL_String2 as '@SQL_String2'; EXEC sp_executesql @SQL_String2; insert into @hanktst select * from ##Temp_Column_Info; drop table ##Temp_Column_Info; Fetch next From DB_cursor into @DBName end select * from @hanktst order by 4,2,3 CLOSE DB_cursor; Deallocate DB_cursor; set @TempRowCnt = (select cast(count(1) as varchar(10)) from @hanktst ) Print ('Rows found: '+ @TempRowCnt +' end ...') end --------
-
==============================
8.일부 사소한 개선
일부 사소한 개선
-> 이전의 대답은 모든 결과를 보여주는되지 않았다
-> 칼럼 이름 필터 가능한 열 이름 변수를 설정하여
DECLARE @columnname nvarchar(150) SET @columnname='' DECLARE @SQL varchar(max) SET @SQL='' SELECT @SQL=@SQL+'UNION select '''+d.name+'.''+sh.name+''.''+o.name COLLATE SQL_Latin1_General_CP1_CI_AS as name,c.name COLLATE SQL_Latin1_General_CP1_CI_AS as columnname,c.column_id from '+d.name+'.sys.columns c inner join '+d.name+'.sys.objects o on c.object_id=o.object_id INNER JOIN '+d.name+'.sys.schemas sh on o.schema_id=sh.schema_id where c.name like ''%'+@columnname+'%'' and sh.name<>''sys'' ' FROM sys.databases d SELECT @SQL=RIGHT(@SQL,LEN(@SQL)-5)+'order by 1,3' --print @SQL EXEC (@SQL)
-
==============================
9.아래의 쿼리를 시도
아래의 쿼리를 시도
DECLARE @Query VARCHAR(max) SELECT @Query = 'USE ? SELECT ''?'' AS DataBaseName, sys.columns.name AS ColumnName , sys.tables.name AS TableName , schema_name (sys.tables.schema_Id) AS schemaName FROM sys.columns JOIN sys.tables ON sys.columns.object_id = sys.tables.object_id WHERE sys.columns.name = ''id'' ' EXEC SP_MSFOREACHDB @Query
모든 데이터베이스에서 ID 열을 포함하는 테이블의 목록을 제공합니다.
-
==============================
10.난 그냥 다음 쿼리는 데이터베이스에 당신에게 테이블의 모든 열 이름을 줄 것이라는 점을 깨달았다 (SQL 서버 2017)
난 그냥 다음 쿼리는 데이터베이스에 당신에게 테이블의 모든 열 이름을 줄 것이라는 점을 깨달았다 (SQL 서버 2017)
SELECT DISTINCT NAME FROM SYSCOLUMNS ORDER BY Name
또는 간단하게
SELECT Name FROM SYSCOLUMNS
당신은 중복 된 이름에 대해 걱정하지 마십시오.
또 다른 옵션은 INFORMATION_SCHEMA에서 SELECT 열 이름입니다
SELECT DISTINCT column_name FROM INFORMATION_SCHEMA.COLUMNS ORDER BY column_name
쿼리에서 열 이름 아래 수행 아니라 단지로 테이블 이름을 가지고하는 것이 더 재미있다.
SELECT Object_Name(Id) As TableName, Name As ColumnName FROM SysColumns
그리고 그 결과는 같을 것이다
TableName ColumnName 0 Table1 column11 1 Table1 Column12 2 Table2 Column21 3 Table2 Column22 4 Table3 Column23
-
==============================
11.
SELECT sys.columns.name AS ColumnName, tables.name AS TableName FROM sys.columns JOIN sys.tables ON sys.columns.object_id = tables.object_id
-
==============================
12.내가 사용 :
내가 사용 :
EXEC sp_MSforeachdb 'Use ? Select * From INFORMATION_SCHEMA.COLUMNS '
내가 필요한 것을 위해 작동하는 것 같다.
-
==============================
13.자신의 DB 서버에 데이터 정렬 재미있어 누가 나 같은 사람들을위한 KM의 솔루션에 마이너 정제 ....
자신의 DB 서버에 데이터 정렬 재미있어 누가 나 같은 사람들을위한 KM의 솔루션에 마이너 정제 ....
DECLARE @SQL varchar(max)='' SELECT @SQL=@SQL+'UNION select '''+d.name +'.''+sh.name+''.''+o.name COLLATE SQL_Latin1_General_CP1_CI_AS,c.name COLLATE SQL_Latin1_General_CP1_CI_AS,c.column_id from '+d.name +'.sys.columns c inner join sys.objects o on c.object_id=o.object_id INNER JOIN sys.schemas sh on o.schema_id=sh.schema_id ' FROM sys.databases d SELECT @SQL=RIGHT(@SQL,LEN(@SQL)-5)+'order by 1,3' --print @SQL EXEC (@SQL)
(그럼에도 불구하고 우리가보기에 랩 할 수있는이 작업을 수행 할 수있는 방법을 찾을 수 있다는 희망에 살고.)
from https://stackoverflow.com/questions/2729126/how-to-find-column-names-for-all-tables-in-all-databases-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 고유 식별자없이 중복 행을 삭제하는 방법 (0) | 2020.04.29 |
---|---|
[SQL] SQL 서버 관리 스튜디오를 사용하여 데이터베이스로 BLOB를 삽입하는 방법 (0) | 2020.04.29 |
[SQL] PostgreSQL의에서 어떤 연산자 대 IN (0) | 2020.04.29 |
[SQL] 어떻게 기존 SQLite는 테이블에 외래 키를 추가하는 방법은 무엇입니까? (0) | 2020.04.29 |
[SQL] 어떻게 SQL 서버 데이터베이스 테이블 컬럼에 이미지를 저장하기 위해 [중복] (0) | 2020.04.29 |