我有一个用于从多个表中搜索的存储过程
`ALTER PROCEDURE [dbo].[rdsp_Srchfld]
(
@strFldlst as nvarchar(max),
@strTblnm as nvarchar(max),
@intSrchStyle as int,
@strcond1 as nvarchar(250),
@strCond2 as nvarchar(250)=null,
@strCond3 as nvarchar(300)
)
AS
BEGIN
declare @strSql as varchar(7000)
--Process
set @strSql = 'select Distinct ' + @strFldlst + ' from ' + @strTblnm
IF @intSrchStyle = 0
BEGIN
SET @strSql = @strSql + ' where ' + @strcond1 + ' = ' + '''' + @strCond2 + '''' + ' order by ' + '' + @strcond3 + ''
END
ELSE IF @intSrchStyle = 1
BEGIN
SET @strSql = @strSql + ' where ' + @strcond1 + ' like ' + '''' + @strCond2 + '%' + '''' + ' order by ' + '' + @strcond3 + ''
END
ELSE IF @intSrchStyle = 2
BEGIN
SET @strSql = @strSql + ' where ' + @strcond1 + ' like ' + '''' + '%' + @strCond2 + '%' + '''' + ' order by ' + '' + @strcond3 + ''
END
EXEC (@strSql)
END`
并将参数从LINQ传递给Sql
var rslt = from srch in custDC.rdsp_Srchfld(fldName, tblName, srchType, cond1, cond2, cond3) select srch;
现在我试图构建我的程序,我收到错误
Error 1 Could not find an implementation of the query pattern for source type 'int'. 'Select' not found.
为什么我收到错误,我该如何实现呢。
答案 0 :(得分:2)
不要这样做。现在放弃你的方法。
首先阅读本文http://www.sommarskog.se/dynamic_sql.html
想一想为什么要创建Linq-to-SQL。看看它的继任者EF。
然后从支持ORM的已建立SQL Server为您的数据库建立模型。然后使用该模型为您提供良好的类型检查代码。让模型为您执行动态SQL。如果您有特殊要求或情况,ORM无法应对。然后考虑编写一个特殊的SP来处理它。
如果你要坚持你的方法,至少要了解SQL Injection attack是什么。了解sp_executesql并使用它。
如果Linq-to-SQL无法正确获取动态SQL,那么在客户端/应用程序层而不是SP中构建语句会更有意义。查看ExecuteQuery的ExecuteCommand和DataContext方法。如果ORM太多,使用vanilla ADO.Net和SqlCommand
都有其优点。