Я хотел бы выполнить этот запрос в хранимой процедуре, но я получаю 2 ошибки:SQL Server: инструкция USE в хранимой процедуре
a database of USE instruction not allowed in a procedure, function, or a trigger.
Incorrect syntax near the keyword 'CREATE'. (Microsoft SQL Server, Error: 154).
Мой код:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_copytable_TEST]
@SourceServer nvarchar(255),
@SourceDatabase nvarchar(255),
@SourceSchema nvarchar(255),
@DestinationSchema nvarchar(255)
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@SQL NVARCHAR(MAX),
@id uniqueidentifier = NEWID()
BEGIN
IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = 'TablesLog_TEST')
CREATE TABLE [dbo].[TablesLog_TEST]
(
[id] [uniqueidentifier] NOT NULL,
[SourceServer] [nvarchar](255) NULL,
[SourceDatabase] [nvarchar](255) NULL,
[SourceSchema] [nvarchar](255) NULL,
[source] [nvarchar](max) NULL,
[destination] [nvarchar](255) NULL,
[timestamp] [datetime] NULL,
[message] [nvarchar](max) NULL,
[type] [smallint] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
INSERT INTO dbo.TablesLog_TEST
SELECT
@id, @SourceServer, @SourceDatabase, @SourceSchema,
'GetAllTables', @DestinationSchema, CURRENT_TIMESTAMP,
'Start Copy', 1
BEGIN TRY
INSERT INTO dbo.TablesLog_TEST
SELECT
@id, @SourceServer, @SourceDatabase, @SourceSchema,
'GetAllTables', @DestinationSchema, CURRENT_TIMESTAMP,
'try 1', 1
-- Create destination schema if it doesn't exist
SELECT @SQL = N'IF NOT EXISTS (SELECT * FROM [' + @SourceDatabase + '].SYS.SCHEMAS WHERE NAME = [' + @DestinationSchema + '])
BEGIN
SELECT @SQL = N'USE ['+ @SourceDatabase +'];
EXEC(''CREATE SCHEMA '+ @DestinationSchema +' '')'
EXEC sp_executesql @SQL
END'
EXEC sp_executesql @SQL
END TRY
BEGIN CATCH
INSERT INTO dbo.TablesLog_TEST
SELECT @id, @SourceServer, @SourceDatabase, @SourceSchema,
'GetAllTables', @DestinationSchema, CURRENT_TIMESTAMP,
'ERROR: ' + ERROR_MESSAGE(), 0
END CATCH
--Return value:
SELECT 1;
END
Кто-то может мне помочь пожалуйста?
С наилучшими пожеланиями
Тонкий
Привет Sandip Patel, Привет Пол Bambury, Спасибо за вашу помощь! Я пробовал, но я получил сообщение, в котором сказано, чтобы объявить переменную @SQL. ОШИБКА. Должна быть объявлена скалярная переменная «@SQL». Но это уже объявлено в начале моей программы! я попытался объявить, но это не нравится :( у вас другое решение? – Slim025
Вы должны объявить эту переменную внутри динамического оператора запроса (красный текст блок) –
Спасибо вам @Sandip Патель за помощь Спасибо вам Павла Bambury для вашей помощи Это работает !!! Проблема заключалась в отсутствии кавычек при построении моего динамического SQL. – Slim025