使用右键单击"脚本为"菜单创建查询时,SQL Server Management Studio始终插入GO命令.为什么?GO实际上做了什么?
我们可以GO多次使用语句SQL Transaction.我有一个很长的T-SQL脚本,我想在一个SQL Transaction.如果一切顺利,那么我将提交否则将回滚.
但是,在运行该查询时,我得到了错误'create function must be the only statement in the batch'.因为我在创建和删除许多功能和程序.
我没有GO在脚本中的任何地方使用过.我的问题是 - 我可以GO在那个长脚本中使用多次语句.因为,GO创建批处理并且如果第一次成功执行批处理但下次失败则会rollback transaction声明能够实际回滚已经执行的吗?
我的脚本结构如下:
PRINT 'Transaction Started'
BEGIN TRY
BEGIN TRAN
Drop Function
....
....
Create Function
....
....
Drop Procedure
....
....
Lots of statements
....
....
COMMIT TRAN
PRINT 'Transaction Succeeded'
END TRY
BEGIN CATCH
PRINT 'Transaction Failed'
IF(@@TRANCOUNT > 0)
ROLLBACK TRAN
END CATCH
Run Code Online (Sandbox Code Playgroud)
我正在创建此脚本,以便在单个脚本中将一些更改从newDB迁移到oldDB.
我有一个简单的脚本更新并显示useraccount.(与管理工作室2010合作)为了防止用户错误,我想在SQL中使用变量(之前从未这样做过).
阅读教程时,它应该像下面的代码示例一样简单,除了我收到错误消息.在网上搜索具有相同错误的人,我最终看到了具有相同错误的非常复杂的代码.有人能给我一个线索吗?
DECLARE @Username nvarchar(256)
Set @Username = 'theUsername'
UPDATE aspnet_Membership
SET IsLockedOut = 0
WHERE UserId IN (SELECT U.UserId
FROM aspnet_Users as U inner join aspnet_Membership M on U.UserId = M.UserId
WHERE u.UserName = @Username)
GO
SELECT U.UserId, U.UserName, M.Password, M.IsLockedOut, U.LastActivityDate
FROM aspnet_Users as U inner join aspnet_Membership M on U.UserId = M.UserId
WHERE u.UserName = @Username
Run Code Online (Sandbox Code Playgroud)
消息137,级别15,状态2,行3必须声明标量变量"@Username".
我正在尝试使用pymssql在python中执行一个sql文件,这个文件包含一个BEGIN TRANSACTION,一个COMMIT TRANSACTION和一个END,以及之前和之后的一些安全网.
我正在尝试在内存中打开文件并执行内容:
file = open(options.sqlFile, 'r')
sqlFileContents = file.read()
file.close()
cursor.execute(sqlFileContents)
conn.commit()
Run Code Online (Sandbox Code Playgroud)
但是它给我带来了错误:
pymssql.ProgrammingError: (102, "Incorrect syntax near 'GO'.DB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 1
5:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 102, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message …Run Code Online (Sandbox Code Playgroud) 多个Web服务器访问SQL Server以获取数字代码,当此代码不存在时,它必须由SQL Server自动生成.
我需要确保即使两个并发调用进入并且代码不存在,也只创建一个代码,并且两个调用都返回相同的代码.所以我必须做这样的事情:
begin lock
if code exists
return code
else
generate code
return code
end lock
Run Code Online (Sandbox Code Playgroud)
我一直在阅读关于隔离级别和表锁定的一些内容,但我对这一切都很糟糕.首先,我认为SERIALIZABLE隔离级别是我需要的,但显然它不是.
那么,你将如何在TSQL中实现"锁定"?
非常感谢.
更新:
当我尝试使用此示例设置可序列化级别时出现此错误:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE get_code
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
BEGIN TRANSACTION
select code from codes where granted is null;
END
GO
Run Code Online (Sandbox Code Playgroud)
消息1018,级别15,状态1,过程get_code,第4行'SERIALIZABLE'附近的语法不正确.如果这是作为表提示的一部分,则现在需要A WITH关键字和括号.有关正确的语法,请参阅SQL Server联机丛书.消息102,级别15,状态1,行5'END'附近的语法不正确.
这是什么意思?
sql-server multithreading synchronization locking sql-server-2005
我在T-SQL中有一个脚本,如下所示:
create table TableName (...)
SET IDENTITY INSERT TableName ON
Run Code Online (Sandbox Code Playgroud)
在第二行我得到错误:
找不到对象"TableName",因为它不存在或您没有权限.
我从Management Studio 2005执行它.当我在这两行之间放置"GO"时,它正在工作.但我想要的是不要使用"GO",因为我希望在完成后将此代码放在我的应用程序中.
所以我的问题是如何在不使用"GO"的情况下完成这项工作,以便我可以从C#应用程序以编程方式运行它.