我在SQL Server 2008中有一个存储过程。我通过@query
声明DECLARE @query NVARCHAR(MAX)
参数,然后根据发送的数据类型设置此@query
然后我使用exec [sys].[sp_executesql] @query
执行存储过程。
我遇到的问题是我在Visual Studio中使用DataSet,它链接到此存储过程(在报表上使用)。
当我以这种方式(使用@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
时,数据集就可以正常工作。
任何帮助将不胜感激。
答案 0 :(得分:0)
另一个选择是以不同的方式编写查询,例如。
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)或wil