有没有办法在存储过程的结果中应用where子句?

时间:2016-02-17 03:05:43

标签: sql-server vb.net stored-procedures

我已经在其中使用union all进行了严格的程序。它是这样的

CREATE PROCEDURE [dbo].[sp_test]
 @date1  datetime,
 @date2  datetime
AS
BEGIN
 select 'Product 1' as Product, * from tab1 where dateStart = @date1 and dateEnd = @date2 and qty >= 100
 union all
 select 'Product 2' as Product, * from tab2 where dateStart = @date1 and dateEnd = @date2 and qty < 100
END

每张桌子都有相同的fields,但Product不是field,它只是我真实程序的样本。在这里写的时间太长了。

当我执行存储过程EXEC sp_test '2016-01-01', '2016-02-01'时,它显示为

Product   | qty
----------------
Product 1 | 120
Product 1 | 178
Product 1 | 250
Product 2 | 75
Product 2 | 50
Product 2 | 23

问题是,如何才能从存储过程Product 1中仅获取结果sp_test

从技术上讲,我想用vb.net在水晶报告中显示结果,我在vb.net中试试这个

Public Function GetData(ByVal date1 As DateTime, ByVal date2 As DateTime) As DataTable
        Dim dt As New DataTable
        Try
            oConn.Open()
            Dim cmdSQL As New SqlCommand("sp_test", oConn)
            cmdSQL.CommandType = CommandType.StoredProcedure
            cmdSQL.Parameters.Add("@date1", SqlDbType.DateTime).Value = date1
            cmdSQL.Parameters.Add("@date2", SqlDbType.DateTime).Value = date2
            Dim daData As New SqlDataAdapter(cmdSQL)
            daData.Fill(dt)
            Return dt
        Catch ex As Exception
            Throw ex
        Finally
            oConn.Close()
        End Try
End Function

但是它显示了所有Produccts,那么如何才能从存储过程中获得Product 1个结果?

3 个答案:

答案 0 :(得分:3)

我真的希望生产中没有SELECT *。对于SQL编码来说,这是一个很大的禁忌。

在VB.net中,您可以使用SELECT方法过滤满足条件的行:

Dim rows[] as DataRow = dt.Select("Product = 'Product 1'")

如果要在进入VB.net图层之前在SQL中进行过滤,请将命令文本更改为:

CREATE TABLE #tmp
(
    Product     varchar(100),
    Qty         int
)

INSERT INTO #tmp (Product, Quantity)
    EXEC sp_test @date1, @date2

SELECT Product, Quantity FROM #tmp
WHERE Product = 'Product 1'

然后移除cmdSQL.CommandType = CommandType.StoredProcedure行。

答案 1 :(得分:1)

您可以将union的查询包装到另一个select语句中,并使union&quot; ed查询成为这样的子选择:

SELECT a, b, c FROM
(
SELECT a, b, c FROM Tb1
UNION ALL
SELECT a, b, c FROM Tb2
)
AS Tb3
WHERE a = 'something'

这将只选择名为a的列中的值等于&#39; something&#39;的行。如果它在第一个或第二个中并不重要,因为WHERE子句实际上是在别名Tb3上运行。

答案 2 :(得分:1)

我对[{3}}不是很熟悉,但是你不能用一个选项包装你的工会并使用第三个参数来过滤结果吗?这样的事情可能是:

CREATE PROCEDURE [dbo].[sp_test]
 @date1  datetime,
 @date2  datetime,
 @product varchar(10)
AS
BEGIN
 select P.Product, 
        --other columns here
 from (
       select 'Product 1' as Product, * from tab1 where dateStart = @date1 and dateEnd = @date2 and qty >= 100
       union all
       select 'Product 2' as Product, * from tab2 where dateStart = @date1 and dateEnd = @date2 and qty < 100
      ) P
 where P.Product = @product
END

然后在您的中添加如下参数:

cmdSQL.Parameters.Add("@date1", SqlDbType.DateTime).Value = date1
cmdSQL.Parameters.Add("@date2", SqlDbType.DateTime).Value = date2
cmdSQL.Parameters.Add("@product", SqlDbType.Varchar).Value = "Product 1"