我已经在其中使用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
个结果?
答案 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
然后在您的vb.net中添加如下参数:
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"