Ответ 1
взгляните на SSMS Tools Pack для SSMS, который позволяет вам делать то, что вам нужно.
Я хотел бы экспортировать специальные выборки результатов запроса SQL Server для экспорта непосредственно в качестве вложений.
Мне бы очень хотелось увидеть параметр "Сохранить как" "Вставить.." вместе с другими текущими доступными параметрами (csv, txt), когда вы щелкните правой кнопкой мыши в SSMS. Я не экспортирую из существующей физической таблицы, и у меня нет прав на создание новых таблиц, поэтому параметры для script физических таблиц для меня не являются параметрами.
Я должен script либо из временных таблиц, либо из набора результатов в окне запроса.
Сейчас я могу экспортировать в csv, а затем импортировать этот файл в другую таблицу, но это время для многократной работы.
Инструмент должен создавать правильные вставки и понимать типы данных, когда он создает значения для значений NULL.
взгляните на SSMS Tools Pack для SSMS, который позволяет вам делать то, что вам нужно.
Лично я просто напишу select против таблицы и сам создам вставки. Кусок торта.
Например:
SELECT 'insert into [pubs].[dbo].[authors](
[au_id],
[au_lname],
[au_fname],
[phone],
[address],
[city],
[state],
[zip],
[contract])
values( ''' +
[au_id] + ''', ''' +
[au_lname] + ''', ''' +
[au_fname] + ''', ''' +
[phone] + ''', ''' +
[address] + ''', ''' +
[city] + ''', ''' +
[state] + ''', ''' +
[zip] + ''', ' +
cast([contract] as nvarchar) + ');'
FROM [pubs].[dbo].[authors]
создаст
insert into [pubs].[dbo].[authors](
[au_id],
[au_lname],
[au_fname],
[phone],
[address],
[city],
[state],
[zip],
[contract])
values( '172-32-1176', 'White', 'Johnson', '408 496-7223', '10932 Bigge Rd.', 'Menlo Park', 'CA', '94025', 1);
insert into [pubs].[dbo].[authors](
[au_id],
[au_lname],
[au_fname],
[phone],
[address],
[city],
[state],
[zip],
[contract])
values( '213-46-8915', 'Green', 'Marjorie', '415 986-7020', '309 63rd St. #411', 'Oakland', 'CA', '94618', 1);
... etc ...
Пара ловушек:
ВНИМАНИЕ!!! КАК ЕСТЬ. В начале script вы можете увидеть пример использования процедуры. Конечно, вы можете сделать эксплоир INSERT, если вам нужно или добавить DataTypes для требуемого преобразования.
Результатом script является выражение SELECT expresions с UNION ALL. Будьте осторожны с сортировкой базы данных. Я не тестировал другую сортировку больше, чем мне нужно.
Для длинной длины полей рекомендую использовать [Сохранить результат как..] в сетке результатов вместо копирования. Bacause вы можете получить cutted script.
/*
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
Это не совсем то, о чем спрашивал OP, но если вы хотите создать insert
script для всех записей в таблице, вы можете сделать это в SSMS (по крайней мере, в 2012 году, возможно, в более старых версиях) без каких-либо дополнительных дополнения.
Щелкните правой кнопкой мыши по базе данных, содержащей таблицу (ы), в которой хранятся ваши данные, и нажмите "Задачи" > "Сгенерировать скрипты". Вы попадете к волшебнику, как вы видите ниже.
Просто нажмите "Далее", если отображается этот первый экран.
Выберите таблицу (таблицы), для которой вы хотите создать script.
Выберите, как вы хотите вывести script.
Мне нравится опция "новое окно запроса".
Нажмите кнопку "Дополнительно" и выберите "Данные только для типов данных" в script
Возможно, вы захотите просмотреть варианты, чтобы увидеть, есть ли что-нибудь еще, что вы хотите изменить. Нажмите "ОК", когда закончите.
Нажмите "Далее", пока вы не перейдете на этот экран. Когда все станет зеленым, у вас будет insert
script!
Мне нравится оставлять этот экран открытым, пока я тестирую свой script, чтобы увидеть, нужно ли мне делать какие-либо изменения.
Я знаю, что это не совсем то, что вы ищете, но вы можете сделать вставку из инструкции select:
INSERT INTO tbl (a, b) SELECT c, d FROM tbl2 WHERE c IN (...)
Очевидно, что это довольно грубо, но я надеюсь, что это поможет понять, что я пытаюсь сказать.
Squirrel SQL также может это сделать.
Записать SQL-запрос, выполнить его для проверки. Затем выделите его и выберите Script/Insert statement (не помните точную формулировку).
У WinSQL на www.synametrics.com есть эта функция, и это довольно удобно. Не уверен, что эта функция находится в бесплатной версии, но вы все равно получаете версию Professional в течение 30 дней.
Это очень удобный и простой в использовании инструмент запросов для любой базы данных, подключенной к ODBC.
TOAD может сделать это из меню "Сохранить как" в сетке данных.
Я написал script для этой проблемы, которая должна работать в любой таблице. (Я говорю "должен", потому что script не проверен на 100% и все еще немного грубо.) Вы можете найти его на http://www.jessemclain.com/downloads/code/sql/spd_Tool_Get_Insert_Into_Values.sql.txt
Там некоторый барахл в нижней части файла, который добавляет хостинговая компания, просто отмените это. Чтобы запустить, просто измените значение @Source_Table на таблицу.
ПРИМЕЧАНИЕ. Текстовый файл, который я разместил, выглядит нормально в Firefox 3.0.11, но не в IE7.