Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用IF将T-SQL插入临时表_Sql Server - Fatal编程技术网

Sql server 使用IF将T-SQL插入临时表

Sql server 使用IF将T-SQL插入临时表,sql-server,Sql Server,我正在运行以下代码,我相信这是简单的代码,但我得到了这个错误: 数据库中已存在名为“tableA”的对象 有没有办法克服这个问题 谢谢 DECLARE @dateA datetime2 SET @dateA = '2015-06-01' IF @dateA <= '2019-01-01' BEGIN DROP TABLE IF EXISTS #tableA SELECT * INTO #tableA FROM view1 WHERE da

我正在运行以下代码,我相信这是简单的代码,但我得到了这个错误:

数据库中已存在名为“tableA”的对象

有没有办法克服这个问题

谢谢

DECLARE @dateA datetime2
SET @dateA = '2015-06-01'

IF @dateA <= '2019-01-01' 
BEGIN
    DROP TABLE IF EXISTS #tableA

    SELECT * 
    INTO #tableA 
    FROM view1 
    WHERE date = @dateA
END
ELSE
BEGIN
    DROP TABLE IF EXISTS #tableA

    SELECT * 
    INTO #tableA 
    FROM view2 
    WHERE date = @dateA
END
根据:

DROP TABLE和CREATE TABLE不应在同一批中的同一个表上执行。否则,可能会发生意外错误

我假设SELECT INTO语句也有同样的问题,因为它还创建了一个新表

您是如何执行SQL代码的

在客户端应用程序中,我会尝试首先单独执行DROP TABLE语句。 在SSMS中,将DROP TABLE语句放在单独的批中可能会起作用: 删除表格(如果存在)表格A 去 声明@dateA datetime2 设置@dateA='2015-06-01'
如果@dateA解决方案是创建一个函数,该函数在给定日期参数的情况下返回相应视图的表

CREATE FUNCTION [dbo].[return_view_depending_on_date](@dateChoice datetime2)

-- note: @returnTable, view1, view2, all must share identical schema/structure
RETURNS @returnTable TABLE (
    [col_one] [nvarchar](10) NULL,
    ...etc
)

AS

BEGIN

    IF @dateChoice <= '2019-01-01'
        BEGIN
            INSERT INTO @returnTable SELECT * FROM view1 WHERE date_col= @dateChoice
        END
    ELSE
        BEGIN
            INSERT INTO @returnTable SELECT * FROM view2 WHERE date_col= @dateChoice
        END

    RETURN

END

如果view1和view2具有相同的模式,更安全的方法是无条件地从view1向表格a中选择TOP0*来创建表格,或者,您知道,只需写出创建表格,然后执行简单的插入。如果它们没有相同的模式,那么将tableA与本质上的动态模式一起使用会带来麻烦;这样的代码最终可能会起作用,也可能不会起作用。如果您经常这样做,请考虑创建一个第三视图,只将WELL VIEW1和VIEW2结合在WHERE子句中,以排除日期截止,并直接从该选项中选择。@ JeroenMostert…或者显式使用CREATETABLE语句来创建tableA。而不是一个额外的视图,两个插入。。。选择在WHERE子句中带有截止日期的查询也可以执行此操作:谢谢你们两位。create table语句将变得很费劲,因为我需要在很多地方使用此脚本。在任何情况下,我都找到了一个解决方案,创建了一个函数,根据dateParam返回view1或view2,并且需要function essentials将create table作为返回表的函数来执行。谢谢两位。谢谢你的回复巴特,但不幸的是,它没有工作。不过,我确实找到了一个解决方案,创建了一个函数,根据日期参数从任一视图返回。干杯保罗,啊,是的。这是Jeroen Mostert第三视图方法的另一种选择。很高兴它对你有用是的。再次感谢!