SQL-запрос не показывает столбцы в DataSet в Visual Studio - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть хранимая процедура в SQL Server 2008. Я объявляю параметр @query через DECLARE @query NVARCHAR(MAX), затем устанавливаю @query в соответствии с типом отправляемых данных, а затем использую exec [sys].[sp_executesql] @query для выполнения хранимая процедура.

Проблема в том, что я использую DataSet в Visual Studio, которая связана с этой хранимой процедурой (используется в отчете).

Когда я выполняю свою хранимую процедуру таким образом (с @query), тогда набор данных не берет данные столбца для показа. Я должен был создать хранимую процедуру таким образом (с @query), потому что мне нужно, чтобы предложение where отличалось в зависимости от данных, отправляемых в.

Мой код:

CREATE PROCEDURE [dbo].[p_Test_GetFooData]
    @pName VARCHAR(250) = '',
    @pID INT = NULL
AS 
    BEGIN
        DECLARE @query NVARCHAR(MAX)

        SET @query = 'SELECT FOO.FirstName, FOO.LastName
                FROM Test.FooOne AS FOO'

        IF ( @pName = '--- SELECT ---' ) 
            BEGIN
                SET @query = @query + ' WHERE FOO.ID = '
                    + CONVERT(VARCHAR(50), @pID) + ''
            END
        ELSE 
            BEGIN
                SET @query = @query + ' WHERE FOO.ID = '
                    + CONVERT(VARCHAR(50), @pID) + ' AND
                                            PP.FirstName + LIKE ''%' + @pName
                    + '%'' '
            END
        EXEC [sys].[sp_executesql] @query           
    END

Я проверил запрос, и он возвращает правильные данные при запуске хранимой процедуры. Когда я не использую SET @query = 'SELECT STATEMENT' EXEC @query, тогда набор данных работает как надо.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 13 февраля 2012

Другой вариант - написать запрос другим способом, например.

SELECT FOO.FirstName,      
       FOO.LastName               
FROM Test.FooOne AS FOO
WHERE FOO.ID = @pID 
and PP.FirstName LIKE case when @pName = '--- Select ---' then PP.FirstName else '%' + @pName + '%' end

Это всегда будет сравнивать Foo.ID с @pID и либо сравнивать pp.FirstName с самим собой (всегда возвращая true), либоВиль

...