2
votes

[Microsoft] [Pilote ODBC 17 pour SQL Server] [SQL Server] Syntaxe incorrecte près de «abcdef». (102) (SQLExecDirectW) ")

ownerpass="abcdef"
owner="yrdy"
sql_login = (
"DECLARE @sql AS NVARCHAR(MAX);"
"DECLARE @Databaseowner sysname = ?;"
"DECLARE @Databaseownerpass sysname = ?;"
"SET @sql = N'if not exists (select * from sys.sql_logins where name = @Databaseowner )'  + N' CREATE LOGIN ' + QUOTENAME(@Databaseowner) + N''' WITH PASSWORD = ' + QUOTENAME(@Databaseownerpass, '''') + N';';"
"EXEC sp_executesql @sql,N'@Databaseowner sysname', N'@Databaseownerpass sysname', @Databaseowner = @Databaseowner, @Databaseownerpass = @Databaseownerpass;")
cursor.execute(sql_login, owner,ownerpass)
=============================================
Getting incorrect syntax error near password

6 commentaires

N '' 'WITH PASSWORD doit être N' WITH PASSWORD .


Et "EXEC sp_executesql @ sql, N '@ Databaseowner sysname', N '@ Databaseownerpass sysname', @Databaseowner = @Databaseowner, @Databaseownerpass = @Databaseownerpass;") doit être "EXEC sp_executesql @sql, N '@ Databaseowner sysname, @Databaseownerpass sysname', @Databaseowner, @Databaseownerpass; "


pyodbc.ProgrammingError: ('42000', u '[42000] [Microsoft] [ODBC Driver 17 for SQL Server] [SQL Server] La procédure ou la fonction a trop d'arguments spécifiés. (8144) (SQLExecDirectW)') obtenant cette erreur N 's'il n'existe pas (sélectionnez * dans sys.sql_logins où nom = @Databaseowner)' + N 'CREATE LOGIN' + QUOTENAME (@Databaseowner) + N 'WITH PASSWORD =' + QUOTENAME (@Databaseownerpass, '' '') + N ';'; "


@AzarManiyar Essayez d'exécuter une instruction comme celle-ci: "EXEC sp_executesql @sql, N '@ Databaseowner sysname, @Databaseownerpass sysname', @Databaseowner, @Databaseownerpass;"


Oui essayé J'ai la même erreur


@AzarManiyar Votre instruction devrait fonctionner même avec cet appel: EXEC sp_executesql @sql, N '@ Databaseowner sysname', @Databaseowner; , car vous essayez de concaténer @Databaseownerpass .


3 Réponses :


1
votes

D'après ce que j'ai trouvé, si votre instruction sql a des paramètres, vous devez modifier votre code comme ceci:

ownerpass="abcdef"
owner="yrdy"
sql_login = (
"DECLARE @sql AS NVARCHAR(MAX);"
"DECLARE @Databaseowner sysname = ?;"
"DECLARE @Databaseownerpass sysname = ?;"
"SET @sql = N'if not exists (select * from sys.sql_logins where name = @Databaseowner )'  + N' CREATE LOGIN ' + QUOTENAME(@Databaseowner) + N''' WITH PASSWORD = ' + QUOTENAME(@Databaseownerpass, '''') + N';';"
"EXEC sp_executesql @sql,N'@Databaseowner sysname', N'@Databaseownerpass sysname', @Databaseowner = @Databaseowner, @Databaseownerpass = @Databaseownerpass;")
cursor.execute(sql_login, (owner,ownerpass))

Référence: (Python) cursor.execute (sql)

J'espère que cela vous aidera.


0 commentaires

1
votes

Commencez par générer une instruction T-SQL valide. Vous avez des erreurs lorsque vous utilisez CREATE LOGIN et sp_executesql .

cursor.execute(sql_login, (owner, ownerpass))

Ensuite, si vous utilisez ? comme espace réservé , exécutez votre script comme ceci:

ownerpass = "abcdef"
owner = "yrdy"
sql_login = (
    "DECLARE @sql AS NVARCHAR(MAX);"
    "DECLARE @Databaseowner sysname = ?;"
    "DECLARE @Databaseownerpass sysname = ?;"
    "SET @sql = 
        N'if not exists (select * from sys.sql_logins where name = @Databaseowner )'  + 
        N' CREATE LOGIN ' + QUOTENAME(@Databaseowner) + 
        N' WITH PASSWORD = ' + QUOTENAME(@Databaseownerpass, '''') + N';';"
    "EXEC sp_executesql @sql, N'@Databaseowner sysname, @Databaseownerpass sysname', @Databaseowner, @Databaseownerpass;"
)   


0 commentaires

0
votes

"SET @sql = N'if n'existe pas (sélectionnez * dans sys.sql_logins où name = @Databaseowner) '+ N' CREATE LOGIN '+ QUOTENAME (@Databaseowner) + N' '' WITH PASSWORD = '+ QUOTENAME (@Databaseownerpass, '' '') + N ';'; "

comment puis-je ajouter check_policy = off dans la ligne ci-dessus?


0 commentaires