Проблема с использованием OPENROWSET для выполнения запроса SQL из файлов - PullRequest
0 голосов
/ 14 апреля 2020

Я использую этот запрос для загрузки команды SQL из файлов:

DECLARE @FileContents  VARCHAR(MAX)

SELECT @FileContents = BulkColumn
FROM OPENROWSET (BULK'E:\SQLQuery5.sql', single_blob) x;

EXECUTE(@FileContents)

Но то, что я получаю из этого, находится в одной строке, и это мешает выполнению запроса из-за "GO" .

Что загружено в SQL:

USE [TEst db]  
GO 

/****** Object:  Table [dbo].[User_details]    Script Date: 4/14/2020 8:16:11 AM ******/  
SET ANSI_NULLS ON  
GO  
SET QUOTED_IDENTIFIER ON  
GO  

CREATE TABLE [dbo].[User_details]
(
    [Id] [int] NOT NULL,   
    [Role] [varchar](50) NULL,   
    [Date] [datetime] NULL,    
    [Status] [tinyint] NOT NULL,   
    [Logid] [int] NOT NULL  
) ON [PRIMARY]  
GO  

/****** Object:  Table [dbo].[User_login]    Script Date: 4/14/2020 8:16:11 AM ******/  
SET ANSI_NULLS ON  
GO  
SET QUOTED_IDENTIFIER ON  
GO  

CREATE TABLE [dbo].[User_login]
(   
     [Id] [int] NOT NULL,   
     [Username] [varchar](100) NULL,   
     [Password] [varchar](100) NULL,   
     [UserId] [int] NOT NULL,   
     [Date] [datetime] NULL,   
     [status] [tinyint] NULL,   
     [logid] [int] NOT NULL  
) ON [PRIMARY]  
GO  

Полученное сообщение об ошибке:

Неверный синтаксис рядом с GO

потому что SQL читает это как одну строку.

Любой способ получить желаемый результат без удаления "GO"?

Содержимое SqlQuery5. sql

USE [TEst db]
GO
/****** Object:  Table [dbo].[User_details]    Script Date: 4/14/2020 8:16:11 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[User_details](
    [Id] [int] NOT NULL,
    [Role] [varchar](50) NULL,
    [Date] [datetime] NULL,
    [Status] [tinyint] NOT NULL,
    [Logid] [int] NOT NULL
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[User_login]    Script Date: 4/14/2020 8:16:11 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[User_login](
    [Id] [int] NOT NULL,
    [Username] [varchar](100) NULL,
    [Password] [varchar](100) NULL,
    [UserId] [int] NOT NULL,
    [Date] [datetime] NULL,
    [status] [tinyint] NULL,
    [logid] [int] NOT NULL
) ON [PRIMARY]
GO

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Один из способов - заменить GO на EXEC во время выполнения.

Попробуйте выполнить следующее:

DECLARE @FileContents VARCHAR(MAX)
DECLARE @sql VARCHAR(MAX)

SELECT @FileContents = BulkColumn
FROM OPENROWSET (BULK'D:\Test\SQLQuery5.sql', single_blob) x;
SET @sql = 'EXEC (''' + REPLACE(REPLACE(@FileContents, '''', ''''''), 'GO', '''); EXEC(''') + ''');'
EXECUTE(@sql)
0 голосов
/ 14 апреля 2020

GO оператор вызывает ошибку в динамических c запросах, поскольку;

SQL Сервер предоставляет команды, которые не являются операторами Transact- SQL, но распознаются sqlcmd и o sql утилиты и SQL Редактор кода Server Management Studio. Эти команды могут использоваться для облегчения чтения и выполнения пакетов и сценариев.

GO сигнализирует об окончании пакета операторов Transact- SQL для SQL Утилиты сервера.

В результате оператор GO не является командой T- SQL, и его нельзя использовать как

EXEC ('USE TEst db GO')

, поскольку он выдаст ошибку.

В частности, ваш вопрос, вы можете изменить оператор

USE [TEst db] 
GO 

следующим образом:

 USE [TEst db];

Ваш запрос будет выполняться в этой базе данных.

...