Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 开始-结束块内的多个插入_Sql_Sql Server_Tsql_Sql Server Express - Fatal编程技术网

Sql 开始-结束块内的多个插入

Sql 开始-结束块内的多个插入,sql,sql-server,tsql,sql-server-express,Sql,Sql Server,Tsql,Sql Server Express,我有一个sql脚本,其中包含超过15万行语句(大多数是插入语句)。我只想在表为空时执行这些插入: IF EXISTS (SELECT * FROM [MyTable]) BEGIN PRINT 'No need to insert data' --Stop executing script END ELSE BEGIN --INSERT #1 --... --Insert #150000 END 问题:ELSE块似乎太大。我尝试使用GO,但它在BEGIN

我有一个sql脚本,其中包含超过15万行语句(大多数是插入语句)。我只想在表为空时执行这些插入:

IF EXISTS (SELECT * FROM [MyTable])
BEGIN
    PRINT 'No need to insert data'
    --Stop executing script
END
ELSE
BEGIN
    --INSERT #1
    --...
    --Insert #150000
END

问题:ELSE块似乎太大。我尝试使用
GO
,但它在BEGIN-END块中不起作用。如何解决这个问题?

要解决巨大的else块,您可以使用以下3种策略中的任意一种

策略1

使用SQL Server中的大容量插入。只需将所有数据转储到csv文件中,并在else块中使用以下语句。将csv文件存储在计算机上,并在下面的FROM语句后给出其UNC路径。这样,在else块中只有一行

BULK INSERT dbo.MyTable
FROM '\\share\somepath\myTableInsertData.csv'
WITH (FORMAT = 'CSV'); 
策略2

编写一个一次只插入
x
行的存储过程。然后可以在
While循环中调用此存储过程,而else块将非常小。您可以从原始SQL在while循环中重复调用此存储过程,然后else块将只剩下几行t-SQL代码

请注意,通过为变量
@numberofrowstatime
使用适当的值,可以控制存储过程一次插入多少行。我使用了1000,因此在一次存储过程调用中插入了1000行

当然,可以根据业务规则编写存储过程的insert语句的脚本。如果插入中有一个模式,则可以将该模式编写到下面的存储过程逻辑中

存储过程

您的SQL


为了对抗巨大的else块,您可以使用以下3种策略中的任何一种

策略1

使用SQL Server中的大容量插入。只需将所有数据转储到csv文件中,并在else块中使用以下语句。将csv文件存储在计算机上,并在下面的FROM语句后给出其UNC路径。这样,在else块中只有一行

BULK INSERT dbo.MyTable
FROM '\\share\somepath\myTableInsertData.csv'
WITH (FORMAT = 'CSV'); 
策略2

编写一个一次只插入
x
行的存储过程。然后可以在
While循环中调用此存储过程,而else块将非常小。您可以从原始SQL在while循环中重复调用此存储过程,然后else块将只剩下几行t-SQL代码

请注意,通过为变量
@numberofrowstatime
使用适当的值,可以控制存储过程一次插入多少行。我使用了1000,因此在一次存储过程调用中插入了1000行

当然,可以根据业务规则编写存储过程的insert语句的脚本。如果插入中有一个模式,则可以将该模式编写到下面的存储过程逻辑中

存储过程

您的SQL

你可以利用:

它只打印了一个空表-希望您能看到这将如何适应您的脚本。

您可以利用:


它只打印一个空表-希望您能看到这将如何适应您的脚本。

您不能简单地在大脚本的开头添加此块,而不使用
else begin。。。结束
构造

IF EXISTS (SELECT * FROM [MyTable])
BEGIN
    PRINT 'No need to insert data'
    --Stop executing script and return
    RETURN
END
--Your old script starts here

你不能简单地在大脚本的开头添加这个块,而不使用
else begin。。。结束
构造

IF EXISTS (SELECT * FROM [MyTable])
BEGIN
    PRINT 'No need to insert data'
    --Stop executing script and return
    RETURN
END
--Your old script starts here

使用
GOTO
语句跳出插入语句怎么样

IF EXISTS (SELECT * FROM [MyTable])
BEGIN
    GOTO NODATA
END

--INSERT #1
--...
--Insert #150000

NODATA:
    PRINT 'No need to insert data'

使用
GOTO
语句跳出插入语句怎么样

IF EXISTS (SELECT * FROM [MyTable])
BEGIN
    GOTO NODATA
END

--INSERT #1
--...
--Insert #150000

NODATA:
    PRINT 'No need to insert data'

我将通过将其分为两部分来解决可能的重复:脚本的第一部分将简单地将数据插入临时表中。如果“[MyTable]”为空,则从临时表中选择数据到目标表中。好主意,谢谢!问题是,修改所有脚本需要很多时间(目前时间太长)。但是我会记住,如果我找不到任何其他方法:)另一个选择是用所有insert语句创建一个存储过程,然后在else块中执行它。重构代码不是一个简单的方法。最好是使用记事本++执行字符串替换操作,如用
\r\n替换
插入
,如果存在(从不存在的表中选择*)\r\n则在\r\n打印“无需插入数据”\r\n--停止执行脚本\r\n插入\r\n插入\r\n插入
。请确保在“替换”选项卡中扩展了搜索模式。您仍然需要手动将不存在的表替换为正确的表。通过搜索不存在的表并单击“查找”选项卡下的“查找文档中的所有内容”,可以再次使用记事本++提供帮助。希望它能帮助我将其分为两部分来解决可能的重复:脚本的第一部分将简单地将数据插入临时表中。如果“[MyTable]”为空,则从临时表中选择数据到目标表中。好主意,谢谢!问题是,修改所有脚本需要很多时间(目前时间太长)。但是我会记住,如果我找不到任何其他方法:)另一个选择是用所有insert语句创建一个存储过程,然后在else块中执行它。重构代码不是一个简单的方法。最好是使用记事本++执行字符串替换操作,如用
\r\n替换
插入
,如果存在(从不存在的表中选择*)\r\n则在\r\n打印“无需插入数据”\r\n--停止执行脚本\r\n插入\r\n插入\r\n插入
。请确保在“替换”选项卡中扩展了搜索模式。您仍然需要手动将不存在的表替换为正确的表。通过搜索不存在的表并单击“查找”选项卡下的“查找文档中的所有内容”,可以再次使用记事本++提供帮助。希望有帮助我不是SQL专家
IF EXISTS (SELECT * FROM [MyTable])
BEGIN
    PRINT 'No need to insert data'
    --Stop executing script and return
    RETURN
END
--Your old script starts here
IF EXISTS (SELECT * FROM [MyTable])
BEGIN
    GOTO NODATA
END

--INSERT #1
--...
--Insert #150000

NODATA:
    PRINT 'No need to insert data'