【问题标题】:Importing SQL Server 2008 stored procedure into Excel 2016 I get an error将 SQL Server 2008 存储过程导入 Excel 2016 时出现错误
【发布时间】:2018-11-18 23:23:16
【问题描述】:

我将存储过程从 SQL Server 2008 导入 Excel 2016,在 Excel 中执行时出错:

将数据类型 nvarchar 转换为日期时出错

这是存储过程[LA_VOTER].[Temp].[dmv_import]

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:           Arash B
-- Create date: 6/5/2018
-- Description:      test for creating dynamic 'Data Entry Signature Verification' worksheeet
-- =============================================
ALTER PROCEDURE [Temp].[dmv_import]
    @date DATE = NULL
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @date_work DATE

    IF @date IS NULL
       SET @date_work = GETDATE()
    ELSE
       SET @date_work = @date 

    /*count of processed*/
    SELECT 
        vi.import_code as 'DMV Category',
        SUM(CASE WHEN CONVERT(date, vi.createdate, 101) = @date_work THEN 1 ELSE 0 END) AS 'received',
        SUM(CASE WHEN CONVERT(date, vi.processed_date, 101) = @date_work THEN 1 ELSE 0 END) AS 'processed'
    FROM 
        DIMSNet.dbo.voter_import vi
    WHERE 
        vi.import_type IN ('DMV')
        AND import_code < 13
    GROUP BY 
        import_code
END

我通过数据在 Excel 中访问它 - 来自下面显示的其他来源。

我从 SQL 中选择并输入“slavote-dr1”以连接服务器; “DIMSNet”选择表和任何随机表,如说明所示。

到达“导入数据”弹出窗口后,我在 Excel 工作表中选择要拖放表格的单元格,然后单击“属性”按钮。

选择“定义”选项卡并将命令类型更改为“SQL”。

在“命令文本框”中输入了可执行文件。由于数据库用于连接,我在命令行中插入了存储过程的完整路径。

Execute "LA_VOTER"."Temp"."dmv_import" ","

我单击“确定”并返回“导入数据”窗口。我点击“确定”导入表格。

我收到上述错误。

我查看了脚本,但看不出这个错误是从哪里来的。有什么可以推荐的吗?

PS。添加 6/12/18 ----- SP 在 SQL 中运行良好。只有在导入 Excel 时才会出现问题。

【问题讨论】:

  • 存储过程的参数是日期,为什么要传入逗号?
  • @UnhandledExcepSean 它将空列返回到 Excel 工作表中。我们可以稍后输入参数并刷新页面以根据使用 AcitvX Command Buttion 和 Vbasic 输入的参数进行填充,以将参数传递给脚本。
  • 您在问题中引用的代码使用的是引号 ("),而不是双撇号 ('')。这是字面上的代码,还是发布问题时出错?
  • 这是我的打字错误,它是双撇号 ('')

标签: sql sql-server excel sql-server-2008 stored-procedures


【解决方案1】:

失败无疑是在存储过程中。几乎可以肯定的是:

sum(case when convert(date, vi.createdate, 101) = @date_work then 1 else 0 end) as received,
sum(case when convert(date, vi.processed_date, 101) = @date_work then 1 else 0 end) as processed

我建议您在数据中找到问题并修复它们。您可以通过以下方式解决问题:

sum(case when isdate(vi.createdate) = 0 then 0
         when convert(date, vi.createdate, 101) = @date_work then 1 
         else 0
    end) as received,
sum(case when isdate(vi.processed_date) = 0 then 0
         when convert(date, vi.processed_date, 101) = @date_work
         then 1
         else 0
    end) as processed

【讨论】:

  • 感谢 Gordon Linoff 的建议。我用你的代码替换了我的代码,仍然出现同样的错误。
  • @user9909962 。 . .如果注释掉这两行,是否还会出现错误?
  • 我注释掉了 2 行,但仍然得到与以前相同的错误: SELECT vi.import_code as 'DMV Category' --,sum(case when convert(date,vi.createdate,110) = *@*date_work then 1 else 0 end) as 'received' --, sum(case when convert(date,vi.processed_date,110) = *@*date_work then 1 else 0 end) as 'processed' FROM DIMSNet.dbo .voter_import vi WHERE vi.import_type in ('DMV') and import_code
【解决方案2】:

OK 使用了不同的方法并使其正常工作。 使用“来自 Microsoft Query”,我的执行脚本是: {CALL LA_VOTE.tmp.dmv_import(?)} 它将我需要的数据导入到我想要的字段中。

http://codebyjoshua.blogspot.com/2012/01/get-data-from-sql-server-stored.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多