SSIS Выполнить запрос SQL с входным параметром DateTime - PullRequest
2 голосов
/ 29 марта 2011

Я потратил несколько дней, пытаясь решить эту проблему.У меня есть пакет служб SSIS с двумя задачами выполнения SQL в контейнере последовательности, один из которых - простое удаление из таблицы, а следующий - простая вставка, которая предшествует удалению.Удаление работает нормально, поэтому подключение и т. Д. В порядке.

Ошибка вставки со следующим расплывчатым и бесполезным сообщением.

failed with the following error: "Syntax error, permission violation, or other nonspecific error". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly. 

Вставка имеет 1 входной параметр, который является датой, которая являетсяпривязан к переменной datetime, установленной на 01.01.2011.Когда я заменю?в запросе задачи sql с жестко закодированной датой задача работает.Я также посмотрел на местных жителей в точке прерывания события перед выполнением задачи вставки, и переменная в порядке.

Я также запустил сеанс SQL Profiler, и я вижу, что запрос на удаление ударяется о БД, но ничегодля вставки (когда он использует входной параметр).

Я использую Visual Studio 2005 Pro SP1 (не мой выбор) и SQL Server 2005 SP3.

С уважением

Mark

Ответы [ 3 ]

6 голосов
/ 02 июня 2011

Я знаю, что вы нашли ответ на свой вопрос. Однако я хотел бы уточнить, что следующий запрос, который вы выполняли с использованием соединения OleDb , действителен и работает в пакете Execute SQL Task in SSIS.

INSERT INTO dbo.table1 (DateCol, OtherCol, OtherCol1) 
SELECT ?, SourceCol1, SourceCol2 FROM dbo.SourceTable

Следующий пример показывает успешную реализацию вышеупомянутого запроса с использованием SSIS 2005 (Business Intelligence Development Studio (BIDS) 2005)

Пошаговый процесс:

  1. Создайте две таблицы с именами dbo.Source и dbo.Destination, используя сценарии, предоставленные в разделе Scripts . Заполните таблицу dbo.Source данными, как показано на скриншоте # 1 . Таблица dbo.Destination изначально будет пустой и будет заполнена исходными данными с помощью задачи «Выполнение SQL».

  2. В пакете служб SSIS создайте соединение OLE DB с именем SQLServer в Connections Managers, указывающее на экземпляр SQL Server по вашему предпочтению. Смотрите скриншот # 2 .

  3. В пакете служб SSIS создайте переменную с именем RecordDate , как показано на скриншоте # 3 .

  4. В пакете служб SSIS поместите Execute SQL Task, как показано на скриншоте # 4 . Настройте задачу, как показано на скриншотах # 5 и # 6 .

  5. Снимок экрана # 7 показывает пример выполнения пакета.

  6. Снимок экрана # 8 показывает данные в таблицах dbo.Source и dbo.Destination после выполнения пакета.

Надеюсь, это поможет.

Сценарии .

CREATE TABLE [dbo].[Destination](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [DateValue] [datetime] NOT NULL,
    [ItemNumber] [varchar](50) NOT NULL,
    [Qty] [int] NOT NULL,
CONSTRAINT [PK_Destination] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Source](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemNumber] [varchar](50) NOT NULL,
    [Qty] [int] NOT NULL,
CONSTRAINT [PK_Source] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

Снимок экрана № 1:

1

Скриншот №2:

2

Снимок экрана № 3:

3

Снимок экрана № 4:

4

Скриншот № 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Скриншот № 8:

8

2 голосов
/ 29 марта 2011

Необходимо убедиться, что ваш оператор SQL имеет правильный тип для параметризации в соответствии с вашим менеджером соединений.

Если вы используете OLE DB - ваш оператор вставки должен иметь вид, подобный INSERT INTO Tbl(col) VALUES (?)

Resultset должен иметь значение «None» (так как нечего возвращать в INSERT), а вкладка «Сопоставление параметров» должна иметь один параметр (или столько же, сколько у вас?), А параметр «Имя параметра» должен (для OLE DB) начните с 0, затем 1, 2 ..., n. Если бы вы использовали соединение ADO, вам нужно было бы назвать параметры Param1, Param2, ... ParamN.

Справочную информацию о передаче переменных соответствующим менеджерам соединений можно посмотреть здесь: http://technet.microsoft.com/en-us/library/cc280502.aspx

Правильный ответ согласно вашему комментарию : Вы не можете использовать сопоставление параметров в запросе такого рода. Но есть простой способ сделать это.

Создайте новую переменную sqlCommand (тип string). щелкните по нему в списке переменных и нажмите F4, чтобы увидеть свойства. Измените «EvaluateAsExpression» на true и щелкните поле выражения, чтобы открыть окно выражения. Здесь сделайте ваш запрос в таком формате "INSERT INTO tbl(dateCol,intCol,charCol) SELECT CONVERT(DATETIME,'" + (DT_STR,20,1252)@[User::dateVar] + "',104) AS dateCol, intCol, charCol from anotherTbl"

Когда вы нажмете Evaluate Expression, вы увидите, что формируется действительный оператор SQL, который вы можете использовать.

Теперь вернитесь к задаче «Выполнение SQL», удалите сопоставление параметров. Закройте диалоговое окно, щелкните задачу «Выполнение SQL», нажмите F4, найдите строку выражений, нажмите кнопку ... и добавьте выражение в свойство «SqlStatementSource» с выражением @ [User :: sqlCommand] (или любым другим именем, которое вы назвали своей переменной ).

Теперь запустите задачу, и она должна работать без проблем.

0 голосов
/ 29 марта 2011

Вы можете найти выражение здесь: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...