Запрос для служб машинного обучения R - Категории фильтрации в предложении Where
Я пытаюсь выполнить запрос в 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-запрос. Затем этот запрос передается в хранимую процедуру, которая запускает R в SQL Server. Проблема заключается в предложении WHERE в запросе. У меня указаны строковые значения, и это нарушает запрос, потому что теперь у меня есть апострофы внутри апострофов.
Я пытался заменить апострофы другими символами, но не могу заставить это работать. Возможно ли таким образом установить строковые значения в запросе?
2 ответа
При их отладке я считаю лучше объявить запрос и просто распечатать результаты, а не просто выполнить его.
Если вы хотите сослаться на апостроф внутри строки, вам действительно нужно вставить два апострофа, например,
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's", а @B - "Peter's", вы бы хотели, чтобы вывод был
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<> с примерами.
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';