[Microsoft] [用于SQL Server的ODBC驱动程序17] [SQL Server]“ abcdef”附近的语法不正确。 (102)(SQLExecDirectW)“)

时间:2019-03-19 07:42:15

标签: sql-server python-3.x python-2.7 azure-sql-database pyodbc

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)
=============================================

在密码附近获取错误的语法错误

3 个答案:

答案 0 :(得分:1)

根据我发现的内容,如果您的sql语句具有参数,则应像这样修改代码:

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))

参考:(Python) cursor.execute(sql)

希望这会有所帮助。

答案 1 :(得分:1)

首先,生成有效的T-SQL语句。使用CREATE LOGINsp_executesql时出现错误。

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;"
)   

然后,如果您使用?作为占位符,请按以下方式执行脚本:

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

答案 2 :(得分:0)

“ SET @sql = N'如果不存在(从sys.sql_logins中选择*,其中name = @Databaseowner)'+ N'CREATE LOGIN'+ QUOTENAME(@Databaseowner)+ N'''WITH PASSWORD ='+ QUOTENAME (@Databaseownerpass,'''')+ N';';“

如何在上面的行中添加check_policy = off?