【问题标题】:Unable to execute SQL Server stored procedure无法执行 SQL Server 存储过程
【发布时间】:2020-11-19 12:35:53
【问题描述】:

尝试执行存储过程时出现以下错误:

消息 2714,级别 16,状态 6,过程 Hire_Termination,第 18 行 [批处理开始第 2 行]
数据库中已经有一个名为“Employees”的对象

我在另一个实例中创建了表,我必须使用 JSON 文件并将其导入 SQL Server:

USE [Kronos]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Hire_Termination]
AS
    DECLARE @JSON nvarchar(max)
    SET @JSON = N'{C:\Automation\Kronos.JSON}'
BEGIN
    SELECT @JSON = BulkColumn
    FROM OPENROWSET (BULK 'C:\Automation\Kronos.JSON', Single_Clob) import

    SET NOCOUNT ON;

    SELECT * 
    INTO [Kronos].[dbo].[Employees]
    FROM OPENJSON (@JSON)
END

【问题讨论】:

  • 在另一个实例上创建表是什么意思?每次执行时,proc 代码都会尝试使用SELECT INTO 创建新表dbo.Employees。一旦proc第一次运行,后续的执行就会出错,因为表已经存在。
  • 不要在没有充分理由的情况下随意使用 3 个零件名称 - 这只会成为维护问题。您的过程在 Kronos 数据库中 - 只需使用 2 部分名称 (schema.table) 来引用正确的对象。

标签: sql json sql-server stored-procedures import


【解决方案1】:

SELECT INTO 创建一个新表。所以不要使用

SELECT * 
INTO [Kronos].[dbo].[Employees]
FROM OPENJSON (@JSON);

使用常规的INSERT 语句,例如

INSERT INTO [Kronos].[dbo].[Employees]
SELECT * 
FROM OPENJSON (@JSON);

注意:最好的做法是完整列出您插入的列选择例如

INSERT INTO [Kronos].[dbo].[Employees] (Col1, Col2, Col3, ...)
SELECT Col1, Col2, Col3, ...
FROM OPENJSON (@JSON);

【讨论】:

    【解决方案2】:

    SELECT INTO 创建一个新表。所以第二次运行SP,它会报错 如果要插入现有表,请使用 插入 Kronos.dbo.Employees 选择... 如果您真的只想替换表格的内容,那么您可以运行 DROP TABLE IF EXISTS 首先是 Kronos.dbo.Employees,然后是 SELECT INTO 语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 2021-05-22
      • 2016-10-15
      • 2016-10-21
      相关资源
      最近更新 更多