【问题标题】:[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near 'abcdef'. (102) (SQLExecDirectW)")[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]'abcdef' 附近的语法不正确。 (102) (SQLExecDirectW)")
【发布时间】:2019-03-19 07:42:14
【问题描述】:
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)
=============================================

在密码附近出现不正确的语法错误

【问题讨论】:

  • N''' WITH PASSWORD 应该是 N' WITH PASSWORD
  • "EXEC sp_executesql @sql,N'@Databaseowner sysname', N'@Databaseownerpass sysname', @Databaseowner = @Databaseowner, @Databaseownerpass = @Databaseownerpass;") 应该是"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]过程或函数指定的参数过多。(8144) ( SQLExecDirectW)') 得到这个错误 N'if not exists (select * from sys.sql_logins where name = @Databaseowner )' + N' CREATE LOGIN ' + QUOTENAME(@Databaseowner) + N' WITH PASSWORD = ' + QUOTENAME(@Databaseownerpass , '''') + N';';"
  • @AzarManiyar 尝试执行如下语句:"EXEC sp_executesql @sql, N'@Databaseowner sysname, @Databaseownerpass sysname', @Databaseowner, @Databaseownerpass;"
  • 是的尝试了同样的错误

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


【解决方案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】:

    根据我的发现,如果你的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)

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      "SET @sql = N'如果不存在 (select * from sys.sql_logins where name = @Databaseowner )' + N' CREATE LOGIN ' + QUOTENAME(@Databaseowner) + N''' WITH PASSWORD = ' + QUOTENAME (@Databaseownerpass, '''') + N';';"

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

      【讨论】:

        猜你喜欢
        • 2020-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        • 2021-06-03
        • 1970-01-01
        相关资源
        最近更新 更多