像这样的存储过程有效
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[AllotTectOnBay]
@date datetime,
@AddTech [dbo].[AddTechnicianBayallotment] READONLY
AS
BEGIN
SET NOCOUNT ON;
begin try
begin transaction
commit transaction
end try
BEGIN CATCH
rollback transaction;
declare @ErrorMessage nvarchar(max), @ErrorSeverity int, @ErrorState int;
select
@ErrorMessage = ERROR_MESSAGE() + '' Line '' + cast (ERROR_LINE() as nvarchar(5)),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH
END
GO
但是当我把所有东西都放在一行上时,它就不起作用了。为什么? SQL Server 是否有像行尾这样的东西?在 C# 中?
问题可能出在
GO
命令上。它必须放在一行中(并且可能包含注释)
Transact-SQL 语句不能与 GO 命令占用同一行。但是,该行可以包含注释。
参考链接:MDSN GO COMMAND
存储过程的
ALTER
到END
可以放在一行中。
作为一个选项,您还可以在多行中定义 sql 语句。
string sqlCommand = @"select * from foobar
where ....";
第一:
“GO”不是 SQL 语法的一部分。这是 SSMS 的指令,将整个脚本分成独立的查询,每个查询将依次执行。这意味着您编写的任何 SQL,如果您打算在 SSMS 之外的任何地方执行它,您需要自己模拟行为(维护连接并依次执行每个批处理)或仅执行重要的批处理。
如果您不使用带引号的标识符(您没有),并且 ANSI_NULLS 的设置是您的默认设置?您不需要执行其中任何一个。
因此,删除顶部的前言,您应该能够执行它。第二:
SQL 中的换行符是空格。它们与任何其他空白区域具有完全相同的功能。 SQL 确实使用“;”作为语句终止符。当您的一批语句在语法上明确时,可以选择使用它。而且几乎总是如此!然而,我们中的许多人始终如一地使用它们,因为我们觉得当 SQL 语句变得相当长并且必须分布在多行中时,它们可以澄清代码,并且可能具有自己的缩进结构,具体取决于您的风格。 (SQL 语句有时会变得非常长……不过,正如我所说,它们是可选的。您不需要它们来解决您的问题,并且简单地添加它们
不会解决您的问题。