【问题标题】:This SQL statement is not a query此 SQL 语句不是查询
【发布时间】:2013-11-12 17:02:57
【问题描述】:

所以我删除了与该主题相关的最后一个问题,因为我认为我的逻辑已经解决了。但是现在当我尝试构建一个 SSIS 包(或者甚至只是使用导入/导出向导)时,我收到以下错误

This sql statement is not a query

代码如下:

DECLARE @start int, @end int
DECLARE @start_ag int, @end_ag int
DECLARE @custID varchar(25)
DECLARE @custID_final varchar(25)
DECLARE @product varchar(50)
DECLARE @AgreementID int
DECLARE @dept varchar (5)
DECLARE @invDate datetime2
DECLARE @startDate datetime2
DECLARE @endDate datetime2

DECLARE @tempInvoices TABLE
(
ProductNumber varchar(15) not null,
CustomerID varchar(25) not null,
CustomerDept varchar (4) null,
InvoiceDate datetime2 not null,
AgreementID int null,
Quantity int not null,
InvoiceNumber varchar(25) not null,
RowNum int null
)

DECLARE @tempAgreements TABLE
(
AgreementID int,
RowNum int
)

INSERT INTO @tempInvoices
(RowNum, CustomerID, CustomerDept, ProductNumber, Quantity, InvoiceDate, InvoiceNumber)
SELECT ROW_NUMBER() OVER (ORDER BY INVOICE) AS RowNum, Account, Dept, CustomerItem, Qty, InvoiceDate, Invoice
FROM [ensite].[dbo].[UI.CustomerInvoices]
where Suffix = 'GEP'
and InvoiceDate = CONVERT (date, GETDATE() - 1)
SET @custID_final = ''

SELECT @start = 1
SELECT @end = MAX(RowNum) FROM @tempInvoices
WHILE (@start <= @end)
BEGIN
    SELECT @custID = CustomerID from @tempInvoices where RowNum = @start 
    SELECT @dept = CustomerDept from @tempInvoices where RowNum = @start
    SELECT @product = ProductNumber from @tempInvoices where RowNum = @start
    SELECT @invDate = InvoiceDate from @tempInvoices where RowNum = @start
    BEGIN
        if @dept <> ''
            SET @custID_final = @custID + '-' + @dept
        else
            SET @custID_final = @custID
    END
    if @custID_final IN (SELECT DISTINCT CustomerID From [CompuData].[PriceAgreements].[AgreementsCustomersPivot])
        BEGIN
            INSERT INTO @tempAgreements 
            (RowNum, AgreementID)
            SELECT ROW_NUMBER() OVER (ORDER BY AgreementID) AS RowNum, AgreementID 
            From [CompuData].[PriceAgreements].[AgreementsCustomersPivot] 
            WHERE CustomerID = @custID_final
            SELECT @start_ag = 1
            SELECT @end_ag = MAX(RowNum) FROM @tempAgreements
            WHILE (@start_ag <= @end_ag)
                BEGIN
                    SELECT @AgreementID = AgreementID FROM @tempAgreements WHERE RowNum = @start_ag
                    if @product IN (SELECT DISTINCT ProductNumber FROM [CompuData].[PriceAgreements].[AgreementsItemsPivot] WHERE AgreementID = @AgreementID)
                        BEGIN
                            SELECT @startDate = StartDate FROM [CompuData].[PriceAgreements].[PriceAgreemets] WHERE AgreementID = @AgreementID
                            SELECT @endDate = EndDate FROM [CompuData].[PriceAgreements].[PriceAgreemets] WHERE AgreementID = @AgreementID                      
                                if @invDate BETWEEN @startDate AND @endDate
                                    BEGIN
                                        UPDATE @tempInvoices
                                        SET AgreementID = @AgreementID
                                        WHERE RowNum = @start
                                        DELETE FROM @tempAgreements
                                        SELECT @start = @start + 1
                                    END
                                else
                                    BEGIN
                                        if @start_ag = @end_ag
                                        BEGIN
                                            DELETE FROM @tempInvoices where RowNum = @start
                                            SELECT @start = @start + 1
                                        END
                                    else
                                        BEGIN
                                            SELECT @start_ag = @start_ag + 1
                                        END
                                    END

                        END 
                    else
                        BEGIN
                                        if @start_ag = @end_ag
                                        BEGIN
                                            DELETE FROM @tempInvoices where RowNum = @start
                                            SELECT @start = @start + 1
                                        END
                                    else
                                        BEGIN
                                            SELECT @start_ag = @start_ag + 1
                                        END
                                    END
                END
        END
    else
        BEGIN
            DELETE FROM @tempInvoices where RowNum = @start
            SELECT @start = @start + 1
        END
END

INSERT INTO [CompuData].[PriceAgreements].[AgreementsInvoicesPivot]
(CustomerID, AgreementID, ProductNumber, Quantity, InvoiceNumber, InvoiceDate)
SELECT CustomerID, AgreementID, ProductNumber, Quantity, InvoiceNumber, InvoiceDate
FROM @tempInvoices

【问题讨论】:

  • 等待您尝试在 SSIS 包中运行它吗?如果您试图将这么多的程序代码转储到 OLEDB 源 SQL 语句中,那么您正在错误地使用该工具。这不是一条 SQL 语句,它大约是 20 条 SQL 语句。
  • 注明。我不确定如何每晚迁移这些数据。想赞恩?
  • 好吧,如果你需要使用这个逻辑来移动你的数据,那么把它变成一个INSERT 语句。然后将其插入通常称为临时表的内容中。然后,您可以从该阶段表中进行选择,并使用 SSIS 将数据移动到您需要的任何位置。截断,冲洗,每晚重复一次。我对您的流程了解得不够多,无法评论上述 SQL 查询的逻辑。

标签: sql sql-server ssis


【解决方案1】:

我的建议如下 - 再说一次,不知道完整的工作流程,但这是我设计的方式。

  1. 创建一个包,首先使用执行 SQL 任务检查表 [TempInvoices] 是否存在,如果不存在(它不应该存在),则创建它:

    如果存在(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TempInvoices]') 并输入 (N'U')) 删除表 [dbo].[TempInvoices] 去吧

    创建表 [TempInvoices] ( ProductNumber varchar(15) 不为空, CustomerID varchar(25) 不为空, CustomerDept varchar (4) 空值, InvoiceDate datetime2 不为空, 协议ID int null, 数量 int 不为空, InvoiceNumber varchar(25) 不为空, RowNum int null )

  2. 重复第一步,但对于 [tempAgreements] 表:

    如果存在(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TempAgreements]') 并输入 (N'U')) 删除表 [dbo].[TempAgreements] 去吧

    创建表 [TempAgreements] ( 协议ID int, RowNum 整数 )

  3. 设置数据流任务以填充您的表。您可以添加已包含在用于获取 OLE DB 数据源的 SQL 查询中的查询语言。确保在属性中将“延迟验证”设置为 True。

  4. 按照@Zane 的指示,使用这些临时表设置后续数据流任务所需的一些额外查询。根据临时表中的一些值,您的代码中似乎有多个路径,因此包中可能有多个路径。

  5. 最后,设置一个最终的数据流任务来填充您的 [AgreementsInvoicesPivot] 表。

这就是我设想的构建方式 - 希望这会有所帮助。

【讨论】:

  • 谢谢马克。我试试看
  • 没问题。在这里发布任何问题。一旦你弄清楚了这个过程,因为它是一个集成服务包,你可以设置一个 SQL 代理作业在夜间运行,或者按你的计划运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多