0

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

所以这就是我遇到的问题;

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 查询。然后将此查询传递到在 SQL Server 中运行 R 的存储过程。问题是查询中的 WHERE 子句。我指定了字符串值,它会中断查询,因为现在我在撇号中有撇号。

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

4

2 回答 2

0
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';
于 2020-09-30T17:01:58.260 回答
0

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

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

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 。

于 2020-09-30T17:02:14.223 回答