You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

在Azure SQL中批量创建登录名时遭遇语法错误求助

解决Azure SQL批量创建登录名的语法错误

这个错误的原因很直白——你在拼接CREATE LOGIN语句时,没有给密码字符串加上单引号。T-SQL要求PASSWORD参数的值必须用单引号包裹,否则数据库引擎会把密码文本当成SQL标识符处理,自然会抛出语法错误。

修正后的完整脚本

declare @Name varchar(100),
        @sql varchar(400),
        @sql2 varchar(400),
        @sql3 varchar(400),
        @sql4 varchar(400),
        @psw varchar(10) 

declare @T table (Name varchar(100)) 
insert into @T values ('SampleUser1'), ('SampleUser2') -- 修正了重复的用户名,避免不必要的循环执行

While exists(select * from @T) 
begin
    select top 1 @Name = name from @T 
    IF NOT EXISTS (SELECT [name] FROM [sys].[sql_logins] WHERE [name] = @Name) 
    BEGIN
        SET @psw = 'Traf@123'
        -- 关键修改:给密码前后添加单引号,T-SQL中用两个单引号表示转义一个单引号
        SET @sql = 'CREATE LOGIN ['+@name+'] WITH PASSWORD = '''+@psw+''''
        EXEC (@sql)
    END 
    DELETE FROM @T WHERE Name = @Name 
END

关键修改点说明

  1. 密码的单引号包裹:原来的脚本生成的SQL语句是CREATE LOGIN [SampleUser1] WITH PASSWORD =Traf@123,缺少单引号导致语法错误。修改后会生成正确的语句:CREATE LOGIN [SampleUser1] WITH PASSWORD = 'Traf@123'
  2. 修正重复用户名:你的临时表@T里插入了两次SampleUser1,虽然IF NOT EXISTS判断会跳过重复创建,但避免重复数据能让循环更高效,这里顺便做了修正。

额外安全建议

如果是生产环境,不建议在脚本里硬编码密码。可以考虑:

  • 使用参数化查询代替动态SQL拼接(更安全,避免注入风险)
  • 通过Azure Key Vault来存储和获取密码,提升安全性

内容的提问来源于stack exchange,提问作者Salman Khatri

火山引擎 最新活动