it-swarm.com.de

Wie gebe ich die SQL-Datentypen aus meiner Abfrage zurück?

Ich habe eine SQL-Abfrage, die eine riesige Datenbank abfragt (wie in hunderten von Views/Tabellen mit schwer lesbaren Namen wie CMM-CPP-FAP-ADD), die ich nicht benötige oder verstehen möchte. Das Ergebnis dieser Abfrage muss in einer Staging-Tabelle gespeichert werden, um einen Bericht bereitzustellen.

Ich muss die Staging-Tabelle erstellen, aber mit Hunderten von Ansichten/Tabellen, durch die Sie die Datentypen finden können, die hier dargestellt werden, muss ich mich fragen, ob es eine bessere Möglichkeit gibt, diese Tabelle zu erstellen.

Kann jemand raten, wie ich eines der SQL Server 2008-Tools zum Ermitteln der Quelldatentypen in meiner SQL 2000-Datenbank verwenden würde?

Als ein allgemeines Beispiel möchte ich von einer Abfrage wissen, wie:

SELECT Auth_First_Name, Auth_Last_Name, Auth_Favorite_Number 
FROM Authors

Anstelle der tatsächlichen Ergebnisse möchte ich Folgendes wissen:

Auth_First_Name is char(25)
Auth_Last_Name is char(50)
Auth_Favorite_Number is int

Ich bin nicht an Einschränkungen interessiert, ich möchte nur die Datentypen kennen.

51
JMP
select * from information_schema.columns

könntest du anfangen.

53
erikkallen

Sie können auch die Ergebnisse (oder die Top 10-Ergebnisse) in eine temporäre Tabelle einfügen und die Spalten aus der temporären Tabelle erhalten (sofern die Spaltennamen alle unterschiedlich sind).

SELECT TOP 10 *
INTO #TempTable
FROM <DataSource>

Dann benutze: 

EXEC tempdb.dbo.sp_help N'#TempTable';

oder

SELECT * 
FROM tempdb.sys.columns 
WHERE [object_id] = OBJECT_ID(N'tempdb..#TempTable');

Hochgerechnet aus Aarons Antwort hier .

24
Trisped

Sie können auch verwenden ...

SQL_VARIANT_PROPERTY()

... in Fällen, in denen Sie keinen direkten Zugriff auf die Metadaten haben (z. B. eine Abfrage eines Verbindungsservers?).

http://msdn.Microsoft.com/de-de/library/ms178550.aspx

In SQL Server 2005 und höher können Sie besser die Katalogsichten (sys.columns) verwenden als INFORMATION_SCHEMA. Es sei denn, die Portierbarkeit auf andere Plattformen ist wichtig. Denken Sie jedoch daran, dass sich die INFORMATION_SCHEMA-Ansichten nicht ändern. In aufeinanderfolgenden Versionen von SQL Server fehlen daher nach und nach Informationen zu neuen Funktionen usw.

19
Aaron Bertrand

Es MUSS de einfacher Weg, dies zu tun ... Und siehe da, es ist ...!

"sp_describe_first_result_set" ist dein Freund!

Jetzt ist mir klar, dass die Frage speziell für SQL Server 2000 gestellt wurde, aber ich suchte nach einer ähnlichen Lösung für spätere Versionen und entdeckte einige native Unterstützung in SQL, um dies zu erreichen.

Ab SQL Server 2012 vgl. "sp_describe_first_result_set" - Link zu BOL

Ich hatte bereits eine Lösung implementiert, die eine ähnliche Technik wie @ Trisped oben verwendet hat, und diese Version herausgenommen, um die native SQL Server-Implementierung zu implementieren.

Falls Sie sich noch nicht in SQL Server 2012 oder Azure SQL Database befinden, finden Sie hier die gespeicherte Prozedur, die ich für Datenbanken vor 2012 erstellt habe:

CREATE PROCEDURE [fn].[GetQueryResultMetadata] 
    @queryText VARCHAR(MAX)
AS
BEGIN

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    --SET NOCOUNT ON;

    PRINT @queryText;

    DECLARE
                @sqlToExec NVARCHAR(MAX) = 
                    'SELECT TOP 1 * INTO #QueryMetadata FROM ('
                    +
                    @queryText
                    +
                    ') T;'
                    + '
                        SELECT
                                    C.Name                          [ColumnName],
                                    TP.Name                         [ColumnType],
                                    C.max_length                    [MaxLength],
                                    C.[precision]                   [Precision],
                                    C.[scale]                       [Scale],
                                    C.[is_nullable]                 IsNullable
                        FROM
                                    tempdb.sys.columns              C
                                        INNER JOIN
                                    tempdb.sys.types                TP
                                                                                ON
                                                                                        TP.system_type_id = C.system_type_id
                                                                                            AND
                                                                                        -- exclude custom types
                                                                                        TP.system_type_id = TP.user_type_id
                        WHERE
                                    [object_id] = OBJECT_ID(N''tempdb..#QueryMetadata'');
            '

    EXEC sp_executesql @sqlToExec

END
11
Paul M Sorauer
SELECT COLUMN_NAME,
       DATA_TYPE,
       CHARACTER_MAXIMUM_LENGTH
FROM information_schema.columns
WHERE TABLE_NAME = 'YOUR_TABLE_NAME'

Sie können Spaltenaliasnamen verwenden, um die Ausgabe zu verbessern.

7
Pawel Czapski

Für SQL Server 2012 und höher: Wenn Sie die Abfrage in eine Zeichenfolge einfügen, können Sie die Datentypen der Ergebnismenge wie folgt abrufen:

DECLARE @query nvarchar(max) = 'select 12.1 / 10.1 AS [Column1]';
EXEC sp_describe_first_result_set @query, null, 0;  
6
redcalx

Können Sie die Staging-Tabelle jedes Mal neu erstellen, wenn die Abfrage ausgeführt wird? In diesem Fall könnten Sie die Syntax SELECT ... INTO verwenden und sich von SQL Server die Erstellung der Tabelle mit den korrekten Spaltentypen usw. erlauben.

SELECT *
INTO your_staging_table
FROM enormous_collection_of_views_tables_etc
6
LukeH
select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME='yourTable';
1
bop

Dadurch erhalten Sie alles, was mit der Spalte zusammenhängt.

SELECT * INTO TMP1
FROM ( SELECT TOP 1 /* rest of your query expression here */ );

SELECT o.name AS obj_name, TYPE_NAME(c.user_type_id) AS type_name, c.*  
FROM sys.objects AS o   
JOIN sys.columns AS c  ON o.object_id = c.object_id  
WHERE o.name = 'TMP1';

DROP TABLE TMP1;
1
user2074102

Ich verwende eine einfache case-Anweisung, um Ergebnisse wiederzugeben, die ich in technischen Spezifikationsdokumenten verwenden kann. Dieses Beispiel enthält nicht alle Bedingungen, denen Sie mit einer Datenbank begegnen, aber es gibt Ihnen eine gute Vorlage, mit der Sie arbeiten können.

SELECT
     TABLE_NAME          AS 'Table Name',
     COLUMN_NAME         AS 'Column Name',
     CASE WHEN DATA_TYPE LIKE '%char'
          THEN DATA_TYPE + '(' + CONVERT(VARCHAR, CHARACTER_MAXIMUM_LENGTH) + ')'
          WHEN DATA_TYPE IN ('bit', 'int', 'smallint', 'date')
          THEN DATA_TYPE
          WHEN DATA_TYPE = 'datetime'
          THEN DATA_TYPE + '(' + CONVERT(VARCHAR, DATETIME_PRECISION) + ')'
          WHEN DATA_TYPE = 'float'
          THEN DATA_TYPE
          WHEN DATA_TYPE IN ('numeric', 'money')
          THEN DATA_TYPE + '(' + CONVERT(VARCHAR, NUMERIC_PRECISION) + ', ' + CONVERT(VARCHAR, NUMERIC_PRECISION_RADIX) + ')'
     END                 AS 'Data Type',
     CASE WHEN IS_NULLABLE = 'NO'
          THEN 'NOT NULL'
          ELSE 'NULL'
     END                 AS 'PK/LK/NOT NULL'
FROM INFORMATION_SCHEMA.COLUMNS 
ORDER BY 
     TABLE_NAME, ORDINAL_POSITION
1
rsidebot

sp_describe_first_result_set

hilft bei der Identifizierung der Datentypen der Abfrage durch Analyse der Datentypen der ersten Ergebnismenge der Abfrage

https://docs.Microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-describe-first-result-set-transact-sql?view=sql-server-2017

0
Alias Varghese