2

私はSQLで一時テーブルを頻繁に作成し、テーブル定義の列名とデータ型を自動的に生成する方法を検討しているので、毎回すべてを検索する必要はありません。

たとえば、私は実行します:

SELECT CustomerID
  ClientID,
  FirstName
  LastName
INTO #Test
From dbo.Customer

最初に、必要な適切な列とデータを使用して一時テーブルを設定します。すべてが完了したら、戻ってINTOステートメントを取り出し、次のように記述します。

CREATE TABLE #Test
(
...
...
);

一時テーブルの最初の作成から列名とデータ型を自動生成する方法を見つけたいと思います。今のところ、最初は自動的に作成された一時テーブルに挿入しているので、これを使用します。

EXEC tempdb..sp_help '#Test';

これにより、すべての列のデータ型を検索しなくても必要なものがすべて得られますが、このようなものから列名を自動生成する方法があるかどうかを知りたいと思いました。したがって、自動生成は次を生成します。

CustomerID int,
ClientID int,
FirstName varchar(50),
LastName varchar(50)

これにより、これをコピーしてcreatetableステートメントに貼り付けることができます。

4

3 に答える 3

8

これはあなたにスタートを与えるかもしれません:

DECLARE @viewname VARCHAR(50);
SET @viewname ='tableorviewname';
SELECT  c.name + ' '+ t.name + 
case t.name  
WHEN 'varchar' THEN '('+CAST(c.max_length AS VARCHAR(3) )+'),'
ELSE ',' 
end
FROM sys.columns c
INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id
WHERE object_id = (SELECT object_id from sys.objects where name = @viewname)
ORDER BY c.column_id

編集:一時テーブル:

一時テーブルは少し異なります。たとえば、これはsql2008で#tv_sourceという名前の一時テーブルに対して機能します。

DECLARE @viewortablename VARCHAR(50);
SET @viewortablename ='tempdb..#tv_source';
SELECT  c.name + ' '+ t.name + 
case t.name  
WHEN 'varchar' THEN '('+CAST(c.max_length AS VARCHAR(3) )+'),'
ELSE ',' 
end
FROM tempdb.sys.columns c
INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id
WHERE object_id =  object_id(@viewortablename)
ORDER BY c.column_id

注:これはコンマ区切りのリストを提供しますが、最後のコンマを削除しようとはしませんでした。リストのみを提供します。これは、文字列に入れて操作するなどして、動的SQLまたは何かとして使用する可能性があります。それでも、それはあなたがやりたいことの始まりをあなたに与えるはずです。

他の人への注意として、sql 2000は、たとえばvarchar(45)で長さを適切に表示せず、varchar部分をリストするだけであり、この質問のためにそれを作り直そうとはしませんでした。

于 2013-01-14T23:35:48.123 に答える
1
SELECT
', ['+ac.name+'] '+Type_Name(User_type_id)+
CASE WHEN Type_Name(User_type_id) = 'Decimal' 
      THEN +'('+CONVERT(Varchar(4),ac.Precision)+','+CONVERT(Varchar(4),ac.Scale)+')' 
      WHEN Type_Name(User_type_id) IN 
            ('tinyint','smallint','int','real','money','float','numeric','smallmoney','DateTime') 
      THEN ''
      ELSE +'('+CONVERT(Varchar(4),ac.Max_Length)+')' 
END AS TableColumn
FROM Tempdb.sys.all_columns AS ac
      INNER JOIN Tempdb.Sys.SysObjects AS so
            ON so.ID = ac.Object_ID
WHERE 1 = 1
AND so.Name = '##YourTempTableGoesHere'
于 2013-04-04T15:13:57.103 に答える
0

...オブジェクトがテーブルの場合、列とデータ型のリストを出力できる関数を作成しました。それが便利な場合はどうでしょうか。

CREATE FUNCTION [dbo].[fnDiscoverColumns]
( @PObjectName NVARCHAR(300) )

RETURNS @Data TABLE ( ColumnList NVARCHAR(350) )

AS
BEGIN

DECLARE @PObjectID TABLE  ( [object_id] INT )
INSERT @PObjectID ( [object_id] )

SELECT [object_id] FROM sys.objects AS O WHERE O.name = @PObjectName AND O.type = 'U'

DECLARE @PObjectDetails TABLE ( [RowNo] INT,[ColumnName] NVARCHAR(300),[XType] INT,[DataType] NVARCHAR(100),[system_type_id] INT,[user_type_id] INT,[MaxLength] NVARCHAR(5),[Precision] INT,[Scale] INT,[ColumnList] NVARCHAR(300) )

INSERT @PObjectDetails ( [RowNo],[ColumnName],[XType],[DataType],[system_type_id],[user_type_id],[MaxLength],[Precision],[Scale],[ColumnList] )

SELECT DISTINCT
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS 'RowNo',
C.name AS 'ColumnName',
T.xtype AS 'XType',
UPPER(T.name) AS 'DataType',
C.system_type_id,
C.user_type_id,
CASE WHEN C.max_length < 0 THEN 'MAX' ELSE CAST(C.max_length AS VARCHAR) END AS 'MaxLength',
C.precision AS 'Precision',
C.scale AS 'Scale',
CASE
WHEN [XType] IN (34,35,36,40,48,52,56,58,59,60,61,62,98,99,104,122,127,189,240,241) THEN QUOTENAME(C.name) +'  '+ UPPER(T.name) +',' 
WHEN [XType] IN (106,108) THEN QUOTENAME(C.name) +'  '+ UPPER(T.name) +'('+ CAST([Precision] AS VARCHAR) +','+ CAST(C.scale AS VARCHAR) +'),'
WHEN [XType] IN (41,42,43,165,167,173,175,231,239) THEN QUOTENAME(C.name) +'  '+ UPPER(T.name) +'('+ CASE WHEN C.max_length < 0 THEN 'MAX'  WHEN C.max_length > 1 THEN CAST(C.max_length / 2 AS VARCHAR) ELSE CAST(C.max_length AS VARCHAR) END +'),' ELSE NULL END AS 'ColumnList'
FROM sys.all_columns AS C
JOIN systypes AS T ON C.system_type_id = T.xusertype
WHERE C.object_id = (SELECT * FROM @PObjectID)  --373576369

--Return column names and data types
INSERT @Data
SELECT 'CREATE TABLE #ColumnsList ('

INSERT @Data
SELECT 
CASE WHEN C.RowNo = (SELECT MAX(RowNo) FROM @PObjectDetails) THEN LEFT(C.ColumnList, ABS(LEN(C.ColumnList + ',') - 2)) ELSE C.ColumnList END AS 'GeneratedColumns'     
FROM @PObjectDetails AS C

INSERT @Data
SELECT ')'

RETURN
END
GO

データベースにコミットしたら、次のように実行します。

SELECT * FROM [dbo].[fnDiscoverColumns] ('ExecutionLogStorage') --name of table

これにより、次のような出力が得られます。

CREATE TABLE #ColumnsList (
[LogEntryId]  BIGINT,
[InstanceName]  NVARCHAR(38),
[ReportID]  UNIQUEIDENTIFIER,
[UserName]  NVARCHAR(260),
[ExecutionId]  NVARCHAR(64),
[RequestType]  TINYINT,
[Format]  NVARCHAR(26),
[Parameters]  NTEXT,
[ReportAction]  TINYINT,
[TimeStart]  DATETIME,
[TimeEnd]  DATETIME,
[TimeDataRetrieval]  INT,
[TimeProcessing]  INT,
[TimeRendering]  INT,
[Source]  TINYINT,
[Status]  NVARCHAR(40),
[ByteCount]  BIGINT,
[RowCount]  BIGINT,
[AdditionalInfo]  XML
)
于 2019-03-26T09:02:20.187 に答える