Вставить скрипт для определенного набора строк в SQL - PullRequest
1 голос
/ 10 марта 2011

Я использую SQL Server 2008. Я использую для извлечения сценария моих данных из таблицы SQL, используя опцию Задачи -> Создать сценарии.

Вот моя проблема:

Допустим,У меня 21 000 записей в таблице Employee.Когда я беру скрипт этой таблицы, он берет скрипт вставки для всех 21000 записей.Какое решение, если я хочу взять из таблицы только сценарий из 18000 записей?

Есть ли какое-либо решение, использующее запрос SQL или из мастера задач?

Заранее спасибо ...

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Создайте новый вид, в котором вы выбираете нужные строки из таблицы Employee, например SELECT TOP 21000...

Тогда просто запишите сценарий этого просмотра вместо таблицы.

0 голосов
/ 22 октября 2013

В случае, если представления не подходят для вас, я написал следующий код, основанный на ответе Аарона Бертранда здесь , который даст оператор вставки для одной записи в БД.

CREATE PROCEDURE dbo.GenerateSingleInsert
@table     NVARCHAR(511), -- expects schema.table notation
@pk_column SYSNAME,       -- column that is primary key
@pk_value  NVARCHAR(10)   -- change data type accordingly
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @cols   NVARCHAR(MAX), @vals   NVARCHAR(MAX),
        @valOut NVARCHAR(MAX), @valSQL NVARCHAR(MAX);

    SELECT @cols = N'', @vals = N'';

    SELECT @cols = @cols + ',' + QUOTENAME(name),
       @vals = @vals + ' + '','' + ' + 'ISNULL('+REPLICATE(CHAR(39),4)+'+RTRIM(' + 
                                            CASE WHEN system_type_id IN (40,41,42,43,58,61) -- dateteime and time stamp type
                                        THEN
                                            'CONVERT(CHAR(8), '  + QUOTENAME(name) + ', 112) + '' ''+ CONVERT(CHAR(14), ' + QUOTENAME(name) + ', 14)'
                                        WHEN system_type_id IN (35) -- text type
                                        THEN
                                            'REPLACE(CAST(' + QUOTENAME(name) + 'as nvarchar(MAX)),'+REPLICATE(CHAR(39),4)+','+REPLICATE(CHAR(39),6)+')' 
                                        ELSE 
                                            'REPLACE(' + QUOTENAME(name) + ','+REPLICATE(CHAR(39),4)+','+REPLICATE(CHAR(39),6)+')' 
                                        END 
                                + ')+' + REPLICATE(CHAR(39),4) + ',''null'') + '

      FROM sys.columns WHERE [object_id] = OBJECT_ID(@table)
      AND system_type_id <> 189 -- can't insert rowversion
      AND is_computed = 0;      -- can't insert computed columns

    SELECT @cols = STUFF(@cols, 1, 1, ''),
       @vals = REPLICATE(CHAR(39),2) + STUFF(@vals, 1, 6, '') + REPLICATE(CHAR(39),2) ;

    SELECT @valSQL = N'SELECT @valOut = ' + @vals + ' FROM ' + @table + ' WHERE '
    + QUOTENAME(@pk_column) + ' = ''' + RTRIM(@pk_value) + ''';';

    EXEC sp_executesql @valSQL, N'@valOut NVARCHAR(MAX) OUTPUT', @valOut OUTPUT;

    SELECT SQL = 'INSERT ' + @table + '(' + @cols + ') SELECT ' + @valOut;
END

Я взял приведенный выше код и упаковал его в следующий процесс, который будет использовать предложенное вами предложение where для выбора операторов вставки для создания

CREATE PROCEDURE dbo.GenerateInserts
    @table     NVARCHAR(511), -- expects schema.table notation
    @pk_column SYSNAME,       -- column that is primary key
@whereClause NVARCHAR(500) -- the where clause used to parse down the data
AS
BEGIN

declare @temp TABLE ( keyValue nvarchar(10),    Pos int );
declare @result TABLE ( insertString nvarchar(MAX) );
declare @query NVARCHAR(MAX)

set @query = 
'with qry as 
(
    SELECT ' + @pk_column + ' as KeyValue, ROW_NUMBER() over(ORDER BY ' + @pk_column + ') Pos
    from ' + @table + '
    ' + @whereClause + '
)
select * from qry'

insert into @temp
exec sp_sqlexec @query

Declare @i int, @key nvarchar(10) 

select @i = count(*) from @temp
WHILE @i > 0 BEGIN

    select @key = KeyValue from @temp where Pos = @i

    insert into @result
    exec [dbo].[GenerateSingleInsert] @table, @pk_column, @key

    set @i = @i - 1 

END

select insertString from @result

END

Вызов может выглядеть следующим образом. Вы передаете имя таблицы, первичный ключ таблицы и предложение where, и в итоге вы должны получить операторы вставки.

set @whereClause = 'where PrettyColorsId > 1000 and PrettyColorsID < 5000'
exec [dbo].GenerateInserts 'dbo.PrettyColors', 'PrettyColorsID', @whereClause

set @whereClause = 'where Color in (' + @SomeValues + ')'
exec [dbo].GenerateInserts 'dbo.PrettyColors', 'PrettyColorsID', @whereClause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...