如果执行该变量失败,则停止查询 - SQL
如何将此逻辑转换为SQL语句?如果执行该变量失败,则停止查询 - SQL
IF @GrantSQL is successful, then continue to insert, if not stop query
这是存储过程:
BEGIN
DECLARE @GrantSql NVARCHAR(500)
SET @GrantSql = 'EXEC sp_addsrvrolemember [' + @LoginName + '], ''sysadmin'''
EXEC sp_executesql @GrantSql
-- IF @GrantSQL is successful, then continue to insert, if not stop query
BEGIN
INSERT INTO....
END
END
DECLARE @GrantSql INT
EXEC @GrantSql = sp_addsrvrolemember @LoginName, 'sysadmin'
IF GrantSql = 0
BEGIN
INSERT INTO...
END
尝试:
IF @@ ERROR <> 0
参见@@ERROR的文档。另外请注意,@LoginName
可能包含一些不好的内容,例如';放桌学生;'。这是一个SQL注入漏洞,通常你会想避免sp_executesql并参数化你的查询。看洛巴诺夫的答案,这更好。
[必备xkcd参考](https://xkcd.com/327/) –
喜欢的东西:
BEGIN
DECLARE @GrantSql NVARCHAR(500)
SET @GrantSql = 'EXEC sp_addsrvrolemember [' + @LoginName + '], ''sysadmin'''
BEGIN TRY
EXEC sp_executesql @GrantSql
END TRY
--'IF @GrantSQL is successful than continue to insert if not stop query'
BEGIN CATCH
PRINT 'Oh man, this happened: '+ @@ERROR
GOTO allDone
END
-- no errors. We're good to continue...
BEGIN
INSERT INTO....
END
allDone:
END
sp_addsrvrolemember可能无一例外地返回1(ERROR!)。 –
也是:https://en.wikipedia.org/wiki/SQL_injection – Milney
@Milney - 如果您是运行SQL代码的人,SQL注入并不是真正的问题。 sp_addsrvrolemember通常是内部执行的内容;它很少在组织之外提供。 –
您可以使用输出参数与sp_executesql
捕获存储过程的返回值(0表示成功,1失败):
DECLARE @GrantSql NVARCHAR(500);
DECLARE @ReturnValue INT;
SET @GrantSql = 'EXEC @ReturnValue = sp_addsrvrolemember [' + @LoginName + '], ''sysadmin'';';
EXEC sp_executesql @GrantSql, N'@ReturnValue INT OUTPUT', @ReturnValue OUT;
IF @ReturnValue = 0
BEGIN
....
END
,但当然,你不需要动态SQL,你可以简单地使用:
DECLARE @ReturnValue INT;
EXEC @ReturnValue = sp_addsrvrolemember @LoginName = @LoginName, @rolename = 'sysadmin';
IF @ReturnValue = 0
BEGIN
....
END
它也似乎您不太可能需要将人员批量添加到系统管理员角色。我不知道你想达到什么,但它可能不是正确的方法
在这种情况下,它的工作原理是因为'sp_addsrvrolemember'只返回两个值,但请注意存储过程的返回类型是'INT ',而不是'BIT'。 – GarethD
@GarethD你是对的,我编辑了我的文章 –
除非你有很好的理由,否则不要使用。它占用了一个完整的字节,并有其他各种问题。答案是正确的,我把它标记为这样,但是这个位几乎总是用来炫耀,并且不像int那样更高效。 –