Я сталкиваюсь с проблемой синтаксиса моего антиспеша и динамического sql exec, и мне было интересно, как проще всего исправить этот цикл, чтобы обозначить \ и любые другие специальные символы, которые появляются в моем динамическом sql при создании имени пользователя нижецикл:
DECLARE @Domain AS VARCHAR(50) = 'WidgetFactory\'
DECLARE @BasicNameList as VARCHAR(MAX) = 'user1,user2,user3'
DECLARE @NAME AS VARCHAR(50)
DECLARE @Query AS NVARCHAR(MAX)
WHILE LEN(@BasicNameList) > 0
BEGIN
SET @NAME = LEFT(@BasicNameList, charindex(',', @BasicNameList+',')-1)
SET @Query = 'If not Exists (select loginname from master.dbo.syslogins
where name = ' + @Domain + @NAME + ' and dbname = ''master'')
Begin
USE [master]
GO
CREATE LOGIN [' + @Domain + @NAME + '] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
GO
ALTER SERVER ROLE [BasicDBA] ADD MEMBER [' + @Domain + @NAME + ']
GO
USE [DB1]
GO
CREATE USER [' + @Domain + @NAME + '] FOR LOGIN [' + @Domain + @NAME + ']
GO
USE [DB1]
GO
ALTER ROLE [db_datareader] ADD MEMBER [' + @Domain + @NAME + ']
GO
USE [DB2]
GO
CREATE USER [' + @Domain + @NAME + '] FOR LOGIN [' + @Domain + @NAME + ']
GO
USE [DB2]
GO
ALTER ROLE [db_datareader] ADD MEMBER [' + @Domain + @NAME + ']
GO
USE [master]
GO
CREATE USER [' + @Domain + @NAME + '] FOR LOGIN [' + @Domain + @NAME + ']
GO
USE [master]
GO
ALTER ROLE [db_datareader] ADD MEMBER [' + @Domain + @NAME + ']
GO
END'
EXEC(@Query)
SET @BasicNameList = STUFF(@BasicNameList, 1, CHARINDEX(',', @BasicNameList+','), '')
END