ВНИМАНИЕ !!! КАК ЕСТЬ. В начале скрипта вы можете увидеть пример, как использовать процедуру. Конечно, вы можете сделать INSERT expresion, если вам нужно, или добавить DataTypes для требуемого преобразования.
Результатом скрипта является констатация выражений SELECT с UNION ALL.
Будьте осторожны с сопоставлением вашей базы данных. Я не проверял другие параметры сортировки больше, чем мне нужно.
Для длинных полей Я рекомендую использовать [Сохранить результат как ..] в таблице результатов вместо Копировать . Потому что вы можете получить вырезанный сценарий.
/*
USE AdventureWorks2012
GO
IF OBJECT_ID('tempdb..#PersonTbl') IS NOT NULL
DROP TABLE #PersonTbl;
GO
SELECT TOP (100)
BusinessEntityID
, PersonType
, NameStyle
, Title
, FirstName
, MiddleName
, LastName
, Suffix
, EmailPromotion
, CONVERT(NVARCHAR(MAX), AdditionalContactInfo) AS [AdditionalContactInfo]
, CONVERT(NVARCHAR(MAX), Demographics) AS [Demographics]
, rowguid
, ModifiedDate
INTO #PersonTbl
FROM Person.Person
EXEC dbo.p_GetTableAsSqlText
@table_name = N'#PersonTbl'
EXEC dbo.p_GetTableAsSqlText
@table_name = N'Person'
, @table_owner = N'Person'
*/
/*********************************************************************************************/
IF OBJECT_ID('dbo.p_GetTableAsSqlText', 'P') IS NOT NULL
DROP PROCEDURE dbo.p_GetTableAsSqlText
GO
CREATE PROCEDURE [dbo].[p_GetTableAsSqlText]
@table_name NVARCHAR(384) /*= 'Person'|'#Person'*/
, @database_name NVARCHAR(384) = NULL /*= 'AdventureWorks2012'*/
, @table_owner NVARCHAR(384) = NULL /*= 'Person'|'dbo'*/
/*WITH ENCRYPTION, RECOMPILE, EXECUTE AS CALLER|SELF|OWNER| 'user_name'*/
AS /*OLEKSANDR PAVLENKO p_GetTableAsSqlText ver.2016.10.11.1*/
DECLARE @isTemporaryTable BIT = 0
/*[DATABASE NAME]*/
IF (PATINDEX('#%', @table_name) <> 0)
BEGIN
SELECT @database_name = DB_NAME(2) /*2 - 'tempdb'*/
, @isTemporaryTable = 1
END
ELSE
SET @database_name = COALESCE(@database_name, DB_NAME())
/*END [DATABASE NAME]*/
/*[SCHEMA]*/
SET @table_owner = COALESCE(@table_owner, SCHEMA_NAME())
DECLARE @database_nameQuoted NVARCHAR(384) = QUOTENAME(@database_name, '')
DECLARE @table_ownerQuoted NVARCHAR(384) = QUOTENAME(@table_owner, '')
DECLARE @table_nameQuoted NVARCHAR(384) = QUOTENAME(@table_name, '')
DECLARE @full_table_name NVARCHAR(769)
/*384 + 1 + 384*/
DECLARE @table_id INT
SET @full_table_name = CONCAT(@database_nameQuoted, '.', @table_ownerQuoted, '.', @table_nameQuoted)
SET @table_id = OBJECT_ID(@full_table_name)
CREATE TABLE #ColumnTbl
(
ColumnId INT
, ColName sysname COLLATE DATABASE_DEFAULT
, TypeId TINYINT
, TypeName sysname COLLATE DATABASE_DEFAULT
, TypeMaxLength INT
)
DECLARE @dynSql NVARCHAR(MAX) = CONCAT('
INSERT INTO #ColumnTbl
SELECT ISC.ORDINAL_POSITION AS [ColumnId]
, ISC.COLUMN_NAME AS [ColName]
, T.system_type_id AS [TypeId]
, ISC.DATA_TYPE AS [TypeName]
, ISC.CHARACTER_MAXIMUM_LENGTH AS [TypeMaxLength]
FROM ', @database_name, '.INFORMATION_SCHEMA.COLUMNS AS [ISC]
INNER JOIN ', @database_name, '.sys.objects AS [O] ON ISC.TABLE_NAME = O.name
INNER JOIN ', @database_name, '.sys.types AS [T] ON ISC.DATA_TYPE = T.name
WHERE ISC.TABLE_CATALOG = "', @database_name, '"
AND ISC.TABLE_SCHEMA = "', @table_owner, '"
AND O.object_id = ', @table_id)
IF (@isTemporaryTable = 0)
SET @dynSql = CONCAT(@dynSql, '
AND ISC.TABLE_NAME = "', @table_name, '"
')
ELSE
SET @dynSql = CONCAT(@dynSql, '
AND ISC.TABLE_NAME LIKE "', @table_name, '%"
')
SET @dynSql = REPLACE(@dynSql, '"', '''')
EXEC(@dynSql)
DECLARE @columnNamesSeparated NVARCHAR(MAX) = SUBSTRING((SELECT ', [' + C.ColName + ']' AS [text()]
FROM #ColumnTbl AS [C]
ORDER BY C.ColumnId
FOR
XML PATH('')
), 2, 4000)
--SELECT @columnNamesSeparated
DECLARE @columnNamesSeparatedWithTypes NVARCHAR(MAX) = SUBSTRING((SELECT '+", " + "CONVERT(' + (CASE C.TypeId
WHEN 231 /*NVARCHAR*/
THEN CONCAT(C.TypeName, '(',
(CASE WHEN C.TypeMaxLength = -1 THEN 'MAX'
ELSE CONVERT(NVARCHAR(MAX), C.TypeMaxLength)
END), ')')
WHEN 239 /*NCHAR*/
THEN CONCAT(C.TypeName, '(', C.TypeMaxLength, ')')
/*WHEN -1 /*XML*/ THEN '(MAX)'*/
ELSE C.TypeName
END) + ', "+ COALESCE('
+ (CASE C.TypeId
WHEN 56 /*INT*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])'
WHEN 40 /*DATE*/
THEN 'N"""" + CONVERT(NVARCHAR(MAX), [' + C.ColName + '], 101) + """"'
WHEN 60 /*MONEY*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])'
WHEN 61 /*DATETIME*/
THEN '"""" + CONVERT(NVARCHAR(MAX), [' + C.ColName + '], 21) + """"'
WHEN 104 /*BIT*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])'
WHEN 106 /*DECIMAL*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])'
WHEN 127 /*BIGINT*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])'
WHEN 189 /*TIMESTAMP*/
THEN 'N"""" + CONVERT(NVARCHAR(MAX), SUBSTRING([' + C.ColName
+ '], 1, 8000), 1) + """"'
WHEN 241 /*XML*/
THEN '"""" + CONVERT(NVARCHAR(MAX), [' + C.ColName + ']) + """"'
ELSE 'N"""" + CONVERT(NVARCHAR(MAX), REPLACE([' + C.ColName
+ '], """", """""")) + """"'
END) + ' , "NULL") + ") AS [' + C.ColName + ']"' + CHAR(10) COLLATE DATABASE_DEFAULT AS [text()]
FROM #ColumnTbl AS [C]
ORDER BY C.ColumnId
FOR
XML PATH('')
), 9, 100000)
/*SELECT @columnNamesSeparated, @full_table_name*/
DECLARE @dynSqlText NVARCHAR(MAX) = CONCAT(N'
SELECT (CASE WHEN ROW_NUMBER() OVER (ORDER BY (SELECT 1 )) = 1 THEN "
/*INSERT INTO ', @full_table_name, '
(', @columnNamesSeparated, '
)*/', '
SELECT T.* /*INTO #ResultTbl*/
FROM (
"
ELSE "UNION ALL "
END) + "SELECT "+ ', @columnNamesSeparatedWithTypes, ' FROM ', @full_table_name)
SET @dynSqlText = CONCAT(@dynSqlText, ' UNION ALL SELECT ") AS [T]
/*SELECT *
FROM #ResultTbl*/
"')
SET @dynSqlText = REPLACE(@dynSqlText, '"', '''')
--SELECT @dynSqlText AS [XML_F52E2B61-18A1-11d1-B105-00805F49916B]
EXEC(@dynSqlText)
IF OBJECT_ID('tempdb..#ColumnTbl') IS NOT NULL
DROP TABLE #ColumnTbl;
GO