查询 R 机器学习服务 - 在 Where 子句中过滤类别

Query for R Machine Learning Services - Filtering Categories in Where Clause

我正在尝试 运行 使用机器学习服务扩展在 SQL 服务器中进行查询。

这就是我遇到的问题;

DECLARE @query NVARCHAR(MAX) = '
SELECT CATEGORY1,CATEGORY2
FROM TABLE
WHERE CATEGORY1 = 'A'
AND CATEGORY2 = 'B'
'
EXEC sp_execute_external_script @language = N'R',
@script = N'data <- Rscript'
,@input_data_1 = @query
,@input_data_1_name= N'data'

你看我正在创建一个带有字符串值的变量,它是 SQL 查询。然后将此查询传递到 运行s R 在 SQL 服务器中的存储过程。问题是查询中的 WHERE 子句。我指定了字符串值,它中断了查询,因为现在我在撇号内有撇号。

我曾尝试用不同的字符替换撇号,但无法正常工作。是否可以通过这种方式在查询中建立字符串值?

DECLARE @query NVARCHAR(MAX) = '
SELECT CATEGORY1,CATEGORY2
FROM TABLE
WHERE CATEGORY1 = ''A''
AND CATEGORY2 = ''B''
';

EXEC sp_execute_external_script @language = N'R',
@script = N'datafromsqlserver <- data
print (datafromsqlserver)
'
,@input_data_1 = @query
,@input_data_1_name= N'data';

调试这些时,我发现最好声明查询并只打印结果,而不是只执行它。

如果您希望在字符串中引用一个撇号,您实际上需要输入两个撇号,例如

DECLARE @query NVARCHAR(MAX) = '
SELECT CATEGORY1,CATEGORY2
FROM TABLE
WHERE CATEGORY1 = ''A''
AND CATEGORY2 = ''B''
'

现在,如果 A 和 B 实际上是变量或其他数据源,您通常不能仅在动态 SQL 中将它们作为变量名引用,您需要将其添加为文本,例如,

DECLARE @query NVARCHAR(MAX) = '
SELECT CATEGORY1,CATEGORY2
FROM TABLE
WHERE CATEGORY1 = ''' + @A + '''
AND CATEGORY2 = ''' + @B + '''
'

还有最后一座桥 - 如果@A 或@B 中可以有撇号。那就尴尬了。

基本上,如果它被写成正常的 SQL(而不是 nvarchar 变量),并且假设@A 是“Bob 的”而@B 是“Peter 的”,您希望输出是

SELECT CATEGORY1,CATEGORY2
FROM TABLE
WHERE CATEGORY1 = 'Bob''s'
AND CATEGORY2 = 'Peter''s'

但是,这意味着在创建可变版本时,您需要将每个撇号替换为两个撇号。但是,这意味着您需要用双撇号替换类别中的撇号 - 并且您的 REPLACE 函数,因为它指的是撇号,需要使用双撇号,例如

DECLARE @query NVARCHAR(MAX) = '
SELECT CATEGORY1,CATEGORY2
FROM TABLE
WHERE CATEGORY1 = ''' + REPLACE(@A,'''','''''') + '''
AND CATEGORY2 = ''' + REPLACE(@B,'''','''''') + '''
'

这里是 DB<>fiddle 示例。