Получение таблицы результатов из запроса, отправленного на связанный сервер и возвращенного хранимой процедурой - PullRequest
0 голосов
/ 02 июля 2019

У меня есть связанный сервер, который содержит данные.Вызов каждой таблицы по отдельности занимает слишком много времени, поэтому единственный вариант - использовать OpenQuery.Проблема заключается в том, что мне нужно передать параметр в запрос.

OpenQuery не поддерживает параметры, означающие, что это должно быть сделано через Exec и строку, созданную с полной командой в нем.Мне также нужно клиентское приложение, написанное на C #.

Я мог бы построить строку в C # и передать ее, но я пытаюсь сделать приложение независимым, когда дело доходит до источника данных, поэтому хочу избежать внедрения SQL в приложение.

Кодк хранимой процедуре

ALTER PROCEDURE [dbo].[Get_Patient_By_MRN] ( @MRN VarChar(10) ) 
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

Declare @Patient_Sql  VarChar(768) = 
'
SELECT * FROM OPENQUERY([CERNER_APP_DB_PROD],'' 
Select  P.PERSON_ID
        , PA1.ALIAS AS MRN
        , PA2.ALIAS AS NHS_Number
        , P.NAME_LAST_KEY
        , P.NAME_FIRST_KEY
        , P.NAME_FULL_FORMATTED
        , P.BIRTH_DT_TM
From   V500.PERSON P    LEFT JOIN V500.PERSON_ALIAS PA1 
                        ON      PA1.PERSON_ID = P.PERSON_ID                     AND 
                                PA1.PERSON_ALIAS_TYPE_CD = 10
                        LEFT JOIN V500.PERSON_ALIAS PA2
                        ON      PA2.PERSON_ID = P.PERSON_ID                     AND 
                                PA2.PERSON_ALIAS_TYPE_CD = 18

Where  PA1.ALIAS = ''''' + @MRN + '''''
'') 
'

Return Exec @Patient_Sql

END

1 Ответ

1 голос
/ 02 июля 2019

Вы были близки с вашим SQL.Вы не RETURN набор данных с хранимой процедурой.RETURN обычно используется для возврата результата успеха SP;0 означает успех, все остальное означает, что это не так (так работает Microsoft SP).Здесь нужно просто выполнить динамический оператор.

Я немного изменил SQL и прекратил внедрение (хотя и очень сложно с varchar(10)) с помощью QUOTENAME, и изменилправильный тип данных для sp_executesql:

ALTER PROCEDURE [dbo].[Get_Patient_By_MRN] (@MRN varchar(10))
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @Patient_Sql nvarchar(MAX) = '
SELECT * FROM OPENQUERY([CERNER_APP_DB_PROD],'' 
Select  P.PERSON_ID
        , PA1.ALIAS AS MRN
        , PA2.ALIAS AS NHS_Number
        , P.NAME_LAST_KEY
        , P.NAME_FIRST_KEY
        , P.NAME_FULL_FORMATTED
        , P.BIRTH_DT_TM
From   V500.PERSON P    LEFT JOIN V500.PERSON_ALIAS PA1 
                        ON      PA1.PERSON_ID = P.PERSON_ID                     AND 
                                PA1.PERSON_ALIAS_TYPE_CD = 10
                        LEFT JOIN V500.PERSON_ALIAS PA2
                        ON      PA2.PERSON_ID = P.PERSON_ID                     AND 
                                PA2.PERSON_ALIAS_TYPE_CD = 18

Where  PA1.ALIAS = ' + QUOTENAME(@MRN,'''') + ');';

    EXEC sp_executesql @Patient_Sql;

END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...