标签: external-scripts

为什么 MS SQL bigint 类型隐式映射到 float64 python 类型,处理它的最佳方法是什么?

Python 整数类型具有无限精度,因此它能够容纳 MS SQL(64 位)的 bigint 值。当传递给外部脚本时,它仍然隐式映射到 float64 python 类型。

这可能会导致大整数的严重计算错误。

那么为什么它映射到 float64 呢?

我的猜测是:

R 是通过可扩展性架构在 Python 之前添加的,它具有固定精度的整数(32 位)。所以它不能容纳 bigint。所以也许这是一个兼容性问题。

确保精确计算的最佳做法是什么?

简单但可行的想法:将 bigint 作为字符串传递,然后将它们解析为 int。

我知道它在实践中引起问题的可能性很小,但还是很高兴知道。

怎么可能有问题:

我写了一个简单的例子来演示它怎么会是一个问题:

CREATE TABLE #test (
    big_integer BIGINT
);

INSERT INTO #test 
    (big_integer)
VALUES
    (36028797018963968),
    (36028797018963968 + 1);

EXECUTE sp_execute_external_script 
    @language = N'Python',
    @input_data_1 = N'SELECT big_integer FROM #test',
    @script = N'
print(InputDataSet.dtypes)
OutputDataSet = InputDataSet
'
Run Code Online (Sandbox Code Playgroud)

在 SQL Server 2019 上执行此代码将为您提供以下结果:

| | (No column name) …
Run Code Online (Sandbox Code Playgroud)

sql-server python external-scripts

5
推荐指数
1
解决办法
163
查看次数

将 CLR 用于正则表达式是否比使用外部脚本更安全?

问题

主要问题我们需要在MS SQL Server 2019上使用正则表达式,能力至少达到POSIX正则表达式的水平。

可能的解决方案

这个来自 stackoverflow 的问答正确地得出结论,如果您的查询必须依赖正则表达式,您应该使用 CLR。这篇 Readgate文章详细阐述了这种方法。所以我和我的一位同事提出了这个解决方案,但我的另一位同事断然表示,在这里使用 CLR 会给安全性和稳定性带来巨大风险,而使用外部脚本(Python 或 R)更安全。

这似乎是一个可疑的说法,因为CLR 中的用户代码是可以管理的,所以也许正好相反,但我没能说服我的同事。

在我绝望中写的另一个问题中,因为我被迫使用外部脚本并且仍然产生一个极快的查询。SQLpro 用户在他的评论中指出:

就安全性而言,使用 Python 或 R 可能比使用 CLR 更糟糕!

我倾向于相信。

问题

所以我有两个问题:

  1. 这正则表达式的解决方案更安全的外部脚本或基于CLR(如描述这里)?为什么?

  2. 我还建议在同一个 Windows Server 上运行 python 代码(必须是同一个服务器,因为策略)但在操作系统上安装了 python intrepeter。因为结果以任何一种方式导出到 CSV 文件中并存储在 SQL Server 中。那么我就可以使用 Python 的多处理模块来实现正确的性能。答案是相同的,在 SQL Server 中运行 Python 比在外部应用程序中更安全。这也是一个有问题的说法。

sql-server regular-expression sql-clr python external-scripts

3
推荐指数
1
解决办法
97
查看次数

在 SQL Server 中将 SQL 文件嵌套到另一个文件中

我有一个简单的 SQL 文件,用于执行一些测试:

DECLARE @VAR1 AS VARCHAR(100) = '12345'
DECLARE @VAR2 AS INTEGER      = 54321

WAITFOR DELAY '00:00:02'

INSERT Orders SELECT @VAR1 AS COL1, @VAR2 AS COL2, ...
...
Run Code Online (Sandbox Code Playgroud)

在启动这一切之前,我想做一些清理工作:

/* Clean SpecialSubSubEntries */
DELETE SpecialSubSubEntries
  WHERE Id IN (SELECT Id FROM SubSubEntries
                 WHERE SubEntryId IN (SELECT Id FROM SubEntries
                                        WHERE EntryId IN (SELECT Id FROM Entries
                                                            WHERE Name='ENTRY01')
                                      )
               )

DELETE SubSubEntries
  WHERE SubEntryId IN (SELECT Id FROM SubEntries
                         WHERE EntryId IN (SELECT Id FROM Entries
                                             WHERE Name='ENTRY01')
                      ) …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql external-scripts

3
推荐指数
1
解决办法
2722
查看次数