2012-02-27 47 views
-4

可能重复:
Parameterizing an SQL IN clause?在SQL Server中传递参数 “IN子句” 2008年

我使用的是下面的过程 这里我使用 “条款” 为attendancecodeid它接受inetger的价值,我怎么可以从vb.net传递参数给我的“sql程序中的子句”,我试过很多东西没有为我寻找解决方案,

alter procedure MPEX_SP_ActivityException_Select 
@startDate date,@endDate date,@AttCode nvarchar(max) 
as 
begin 
set nocount on 
select e.employeeId,e.Badge,e.LastName,e.FirstName,a.Date,ac.code 
from employee e join attendance a on a.fkEmployee=e.employeeId 
join attendancecodes ac on ac.attendancecodesid=a.fkattendancecode 
where a.Date between @startDate and @endDate and ac.code in (@AttCode) 
end 
go 

在此先感谢

Arasu

+0

嗨你能告诉我@AttCode的价值 – 2012-02-27 15:28:16

+2

重复[参数化SQL IN子句?](http://stackoverflow.com/questions/337704/parameterizing-an-sql-in-clause)或http://stackoverflow.com/questions/2944511/sql-server-in-clause-with-a-declared-variable或其他100人 – gbn 2012-02-27 15:34:27

回答

1

这可能是重复的,但我不能找到相应的建议为存储过程的表值参数可能是一个可行的解决方案类似的问题的任何答案,并且消除了对动态SQL和SQL注入风险的需求(并非所有黑客都与此风险相关)。表值参数也应该提供更好的性能,因为执行计划可以存储,而不是动态解决方案,其中计划必须在运行中创建。

CREATE TYPE dbo.AttCodeTableType AS TABLE (AttCode VARCHAR(MAX)) 
GO 
CREATE PROCEDURE PEX_SP_ActivityException_Select (@startDate DATE, @EndDate DATE, @AttCodes dbo.AttCodeTableType READONLY) 
AS 
BEGIN 
    SELECT e.EmployeeID, e.Badge, e.LastName, e.FirstName, a.Date, ac.Code 
    FROM Employee e 
      INNER JOIN Attendance a 
       ON a.FKEmployee = e.EmployeeID 
      INNER JOIN AttendanceCodes ac 
       ON ac.AttendanceCodesID = a.FKAttendanceCode 
      INNER JOIN @AttCodes act 
       ON act.AttCode = ac.Code 
    WHERE a.Date BETWEEN @StartDate AND @EndDate 

END 
GO 

然后执行,你可以使用类似的过程:在vb.net

DECLARE @Table AS dbo.AttCodeTableType 
INSERT @Table VALUES ('Code1'), ('Code2'), ('Code3') 

EXEC PEX_SP_ActivityException_Select @Table 

要创建一个SQL参数从数据表,你会使用类似以下内容:

dim sqlParam as new SqlParameter("@Table", DataTable) 
sqlParam.SqlDbType = SqlDbType.Structured 
sqlParam.TypeName = "dbo.AttCodeTableType" 

阅读here了解更多信息。

最后,接受您的接受率!