2

我希望该过程首先检查临时表是否已经存在。如果是,则删除表格并继续选择表格。但我得到了这个错误:

'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.

我的代码如下所示:

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[GetData]
    @Param_Id int
AS
BEGIN

If OBJECT_ID('temp_table') is not null
drop table temp_table

select data_info into temp_table
from data_info_table1

END

但我不断收到同样的错误。有什么建议么?

4

7 回答 7

0

GO 命令表示一批 T-SQL 语句的结束。GO 命令之后的任何语句都表示新一批查询或 T-SQL 语句的开始。因此,我建议您删除开头的 GO 命令并保留 CREATE 语句之前的命令,因此现在它成为后续查询批处理中的第一个语句。

该声明将如下所示

SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

GO
CREATE PROCEDURE [dbo].[GetData] @Param_Id int
AS
BEGIN

If OBJECT_ID('temp_table') IS NOT NULL DROP table temp_table

SELECT data_info INTO temp_table FROM data_info_table1

END
GO
于 2013-09-09T12:18:23.217 回答
0

你想让程序去 ansi Nulls 吗?尝试在程序内部设置您的 Set Ansi Null On。

此外,如果您手动执行此操作,您可以首先通过仅选择该代码并运行它来更改选项,然后仅选择存储过程并单独运行它。

于 2012-06-05T14:18:09.677 回答
0

尝试将 GO 放在 DROP TABLE 之后。我发现 IF OBJECT_ID( ) IS NOT NULL DROP TABLE ** 本身并不总是有效,但在它之后使用 GO 似乎是可靠的: IF OBJECT_ID( ) IS NOT NULL DROP TABLE ** GO

于 2014-05-14T21:30:39.057 回答
0

您不想因为您在数据库中使用永久结构而造成 2 个不同的用户丢失他们的数据的可能性,对吗?如果您创建静态表会发生什么。然后它实际上非常简单。如果您使用会话临时表(名称看起来像 #temp_table),则需要在 tempdb 数据库中查找这些内容,如下所示:

IF OBJECT_ID('tempdb..#temp_table') IS NOT NULL

这样做只是一种预防措施,因为名称以 # 开头的表会在查询完成后被删除,并且这些表是特定于查询的,这意味着它不会干扰其他用户或请求的并行连接。你的整个脚本应该是这样的:

GO
If OBJECT_ID('GetData') is not null
      drop PROCEDURE GetData
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[GetData]
    @Param_Id int
AS
BEGIN

   If OBJECT_ID('tempdb..#temp_table') is not null
        drop table #temp_table

   select data_info into #temp_table
   from data_info_table1

    -- do what ever you need to do here with you data and spit it out to user.
END
GO
于 2014-04-03T21:20:40.700 回答
0

当脚本如下所示时,我收到相同的错误消息。这意味着GO缺少声明。

if Exists(select object_id from sys.objects where name = 'GetData' and type = 'p')
Begin
    Drop Proc GetData
End
GO --Missing part
CREATE PROCEDURE [dbo].[GetData]
@Param_Id int
AS
BEGIN
    If OBJECT_ID('temp_table') is not null
       drop table temp_table

    select data_info into temp_table from data_info_table1
END
于 2012-06-05T15:53:02.297 回答
0

存在编译器错误。如果你真的想创建这个过程并且表 temp_table 是真正的 tamp 表,你可以在创建过程之前尝试删除它。像这样:

If OBJECT_ID('temp_table') is not null
drop table temp_table
go

create PROCEDURE [dbo].[GetData]
    @Param_Id int
AS
BEGIN

If OBJECT_ID('temp_table') is not null
drop table temp_table

select data_info into temp_table
from data_info_table1

END

或者真的使用像#table、##table 或@table 这样的临时表

于 2015-05-15T15:07:09.387 回答
-1

如果你用这个改变你的存储过程怎么办?:

CREATE PROCEDURE [dbo].[GetData]
    @Param_Id int
AS
BEGIN

If EXISTS(SELECT * FROM sys.tables WHERE name = 'temp_table')
BEGIN
    drop table temp_table
END

DECLARE @SQL VARCHAR(1000)
SET @SQL = '
select data_info into temp_table
from data_info_table1'

EXEC(@SQL)

END
于 2012-06-05T14:05:57.187 回答