如何在SQL Server中发送WhereClause到EXEC

Mik*_*ish 0 c# sql-server exec

ALTER PROCEDURE [dbo].[GetTimeSheetsAttendance]

@WhereClause varchar
AS

EXEC  ('Select vwEmployeeList.ID,vwEmployeeList.Code,
        tbGNClient.FName + '' '' +  tbGNClient.MName + '' ''+ tbGNClient.LName as Name,
        EmployeeAttendanceTb.EmpAttID, EmployeeAttendanceTb.EmpAttSetupID,
        EmployeeAttendanceTb.GNClientID, EmployeeAttendanceTb.SheetID,
        EmployeeAttendanceTb.Date, EmployeeAttendanceTb.TimeIn,
        EmployeeAttendanceTb.TimeOut, EmployeeAttendanceTb.HasExtraTime,
        EmployeeAttendanceTb.ExtraTime, EmployeeAttendanceTb.TotalOfHours,
        EmployeeAttendanceTb.TotalOfCost, EmployeeAttendanceTb.Description,
        vwEmployeeList.Department,
        EmployeeAttendSetup.NoMaximumUnits,
        EmployeeAttendSetup.NoMinimumUnits
        From EmployeeAttendanceTb
        LEFT JOIN vwEmployeeList on EmployeeAttendanceTb.GNClientID = vwEmployeeList.ID
        LEFT JOIN tbGNClient on vwEmployeeList.ID = tbGNClient.GNClientID
        LEFT JOIN EmployeeAttendSetup on EmployeeAttendanceTb.GNClientID = EmployeeAttendSetup.EmpID And EmployeeAttendanceTb.EmpAttSetupID  = EmployeeAttendSetup.AttndUnitsID
        ' + ' ' + @WhereClause)
Run Code Online (Sandbox Code Playgroud)

注意:@WhereClause是从C#应用程序发送的参数.

DBType=nvarchar.. 
@WhereClause.Value= "Where EmployeeAttendanceTb.GNClientID=17"
Run Code Online (Sandbox Code Playgroud)

例外:

尝试使用数据访问应用程序块时出现一些问题,请检查以下错误消息:"W"附近的语法不正确.

Mar*_*rtW 5

问题主要是由于您没有声明@WhereClause参数的长度,只说明它是varchar.这意味着它获得默认长度,在变量声明中为1,因此只有WHERE子句的"W"实际传递给EXEC.

如果未在数据定义或变量声明语句中指定n,则默认长度为1.