一个表达式中的多个 Azure SQL 防火墙规则

Multiple Azure SQL Firewall Rules in One Expression

如何在一个 SQL 表达式中设置多个 database-level firewall rules?我有许多 IP 地址要在多个数据库上列入白名单。我希望执行以下操作:

EXECUTE sp_set_database_firewall_rule
@name = N'Test1',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x',
@name = N'Test2',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x',
@name = N'Test3',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x',
@name = N'Test4',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x',
@name = N'Test5',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x',,
@name = N'Test6',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x',
@name = N'Test7',
@start_ip_address = 'x.x.x.x', @end_ip_address = 'x.x.x.x'

运行 以上查询无效。我不得不一次输入 1。感谢任何帮助。

正如您在问题中所述,T-SQL 不支持您尝试执行的语法。您可以做的是使用动态 SQL 使其更容易 - 仅使用一个语句:

DECLARE @SQL NVARCHAR(MAX) = '';

;WITH iplists (IPAddrStart, IPAddrEnd, RuleName) AS 
(
    SELECT '100.0.0.0', '100.0.0.1', 'name0'
    UNION ALL
    SELECT '100.0.0.2', '100.0.0.3', 'name1'
    UNION ALL
    SELECT '100.0.0.4', '100.0.0.5', 'name2'
)
SELECT @SQL+= 'EXECUTE sp_set_database_firewall_rule @name = N''' + iplists.RuleName 
+ ''', @start_ip_address = ''' + iplists.IPAddrStart + ''', @end_ip_address = ''' + 
iplists.IPAddrEnd + '''; ' + CHAR(13)
FROM iplists;

--PRINT @SQL;
EXEC (@SQL);

我知道如果你想要每行一个地址范围,上面的方法对大多数人都有效。我想要一些更容易复制和粘贴的东西。

这对我有用,因为我只想要相同的 IP 开始和结束 - 所以像这样的东西效果很好:

DECLARE @tempThings TABLE
      (
          ipaddr NVARCHAR(30)
      );
INSERT  @tempThings
VALUES
    ( '100.0.0.0' )
   ,( '100.0.0.65' )
   ,( '100.0.0.76' );
  

SELECT
    *
   ,'EXECUTE sp_set_firewall_rule ' + 'N''Name '
    + CONVERT (NVARCHAR(5), CAST(RAND (CHECKSUM (NEWID ())) * 1000 AS INT)) + ''',' + '''' + [ipaddr] + ''',' + ''''
    + [ipaddr] + '''' + ';' [CommandList]
    FROM    @tempThings;

产生: