如何将此逻辑转换为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
答案 0 :(得分:3)
DECLARE @GrantSql INT
EXEC @GrantSql = sp_addsrvrolemember @LoginName, 'sysadmin'
IF GrantSql = 0
BEGIN
INSERT INTO...
END
答案 1 :(得分:1)
尝试:
IF @@ ERROR<> 0
请参阅@@ERROR的文档。另请注意,@LoginName
可能包含不良内容,例如&#39 ;;放桌学生;'。这是一个SQL注入漏洞,一般来说,您希望避免使用sp_executesql并对查询进行参数化。请参阅Lobanov的回答,这是更好的。
答案 2 :(得分:-1)
类似的东西:
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
答案 3 :(得分:-1)
您可以使用带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
您似乎也不太可能需要批量添加人员到sysadmin角色。我不知道你想要达到的目标,但这可能不是正确的方法