В этом ответе я попытаюсь воссоздать проблему, о которой вы упоминали в вопросе, а также объясню, как я решил эту проблему.
Сначала давайте создадим две таблицы с именами dbo.MKTG_Recent
и dbo.Table_1
, используя сценарии в разделе Создать сценарий таблиц . Я создал эти таблицы на основе некоторых предположений, которые я сделал, используя данные, представленные в вопросе. Используя скрипт, таблица dbo.MKTG_Recent
будет заполнена 1 записью.
Затем создайте хранимую процедуру с именем dbo.MKTG_Current
, используя сценарий, предоставленный в разделе Создать сценарий хранимой процедуры раздел.
Если мы попытаемся выполнить хранимую процедуру командой EXEC как EXEC MKTG_Current null, null
, будет выдано сообщение об ошибке Msg 214, Level 16, State 3, Procedure sp_executesql, Line 1
Procedure expects parameter '@parameters' of type 'ntext/nchar/nvarchar'.
. Смотрите скриншот # 1
После прочтения MSDN об использовании процедуры sp_executesql я обнаружил, что второй параметр хранимой процедуры определяет типы выходных параметров, и он должен быть Строка Юникода. Итак, я изменил хранимую процедуру, предоставив второй параметр в виде строки Unicode с префиксом N. Смотрите скриншот # 2 для изменения хранимой процедуры.
Снимок экрана # 3 показывает вывод хранимой процедуры dbo.MKTG_Current
после внесения изменений. Хранимая процедура выдаст два выхода. Один для оператора запроса в переменной @Bork, который передается в sp_executesql, а другой вывод соответствует оператору SELECT, который отображает переменные OUTPUT.
Исходя из требования, я не уверен, что если вам даже нужно вызвать sp_executesql, вы можете написать хранимую процедуру, как показано в разделе Упрощенная хранимая процедура . Я могу ошибаться, потому что я не совсем понимаю требование. Снимок экрана # 4 показывает вывод упрощенной хранимой процедуры. Оператор SELECT не требуется, поскольку значения передаются через параметры OUTPUT . Я включил оператор SELECT только для отображения результатов запроса.
Надеюсь, это направит вас в правильном направлении.
Сценарий создания таблиц:
CREATE TABLE [dbo].[MKTG_Recent](
[Table] [varchar](40) NOT NULL,
[AIID] [int] NOT NULL,
[date_added] [datetime] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Table_1](
[AIID] [int] NOT NULL,
[added] [smalldatetime] NOT NULL,
[named] [varchar](50) NOT NULL
) ON [PRIMARY]
GO
INSERT INTO dbo.MKTG_Recent ([Table], AIID, date_added)
VALUES ('Table_1', 1, '2011-08-01')
GO
Сценарий создания хранимой процедуры:
SET ANSI_NULLS ON
SET NOCOUNT ON
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[MKTG_Current]
( @added SMALLDATETIME OUTPUT
, @named VARCHAR(50) OUTPUT
)
AS
DECLARE @pDate SMALLDATETIME;
DECLARE @AIID INT;
DECLARE @Table VARCHAR(50);
DECLARE @Bork NVARCHAR(350);
SET @pDate = GETDATE()
SELECT @Table = [Table]
, @AIID = AIID
, @added = date_added
FROM dbo.MKTG_Recent
WHERE date_added > DATEDIFF(day, date_added, DATEADD(DD, 30, @pDate))
SET @named = @Table
SET @Bork = ' SELECT *
FROM ' + QUOTENAME(@Table) + '
WHERE AIID= ' + CAST(@AIID AS VARCHAR(100))
EXECUTE sp_executesql @Bork
, @added OUTPUT
, @named OUTPUT
SELECT @added
, @named
GO
Упрощенная хранимая процедура:
SET ANSI_NULLS ON
SET NOCOUNT ON
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[MKTG_Current]
( @added SMALLDATETIME OUTPUT
, @named VARCHAR(50) OUTPUT
)
AS
DECLARE @Table VARCHAR(50);
SELECT @named = [Table]
, @added = date_added
FROM dbo.MKTG_Recent
WHERE date_added > DATEDIFF(day, date_added, DATEADD(DD, 30, GETDATE()))
SELECT @added AS added
, @named AS named
GO
Скриншоты:
# 1: Выполнение с сообщением об ошибке
![Error_Message](https://i.stack.imgur.com/nxwpN.png)
# 2: Изменение внесено в хранимую процедуру
![Modified_SP](https://i.stack.imgur.com/wuBua.png)
# 3: Вывод хранимой процедуры после изменений
![Stored_procedure_output](https://i.stack.imgur.com/nfa3o.png)
# 4: Упрощенный вывод хранимой процедуры
![Simplified_stored_procedure_output](https://i.stack.imgur.com/kplfw.png)