通过字段名称作为存储过程的参数
我要在选定的组合框项目上的搜索词(文本框)(数据库字段), 我的存储过程是:
USE [QueueDB]
GO
/****** Object: StoredProcedure [dbo].[SP_SelectDriver_ByNameAndField] Script Date: 09/07/2012 17:20:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_SelectDriver_ByNameAndField]
@Word nvarchar(100),
@Field nvarchar(100)
AS
BEGIN
select * from Driver where @Field like + N'%' + @Word + '%'
END
它不起作用,您建议采用什么方式来执行此搜索方法?
Azize德尔,
组合框hamishe baiangare查找AST科hamanande表EIST柯2 sotoune编号VA描述者darad。 Agar gharar ast meghdare entekhabie ComboBox be StoredProcedure ferestade beshe,pishnahad mikonam az Id e Bind shind be SelectedValue e ComboBox estefade beshe。 Nvarchar ro be SP ferestadan kare dorosti nist。
尊敬的先生/女士,
组合框始终是查找信息系统的替代品就是喜欢一个只有两列,Id和描述者的表。如果您要将ComboBox的SelectedValue发送到您的StoredProcedure,我建议将SelectedValue的绑定值作为整数发送给它。然后你有很多选项来编写你的查询。通过使用Nvarchar发送LookUp值可能会在您的应用程序的将来产生很多副作用(与排序相比,它有许多问题)。
干杯
更改代码这样:
USE [QueueDB]
GO
/****** Object: StoredProcedure [dbo].[SP_SelectDriver_ByNameAndField] Script Date: 09/07/2012 17:20:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_SelectDriver_ByNameAndField] (
@Word Nvarchar(100)
, @Field TinyInt
) As Begin
Select *
From Driver
Where Case When @Field = 1
And Column1 Like + N'%' + @Word + '%'
Then 1
When @Field = 2
And Column2 Like + N'%' + @Word + '%'
Then 1
When @Field = 3
And Column3 Like + N'%' + @Word + '%'
Then 1
Else 0
End = 1
;
Return 0;
END
您也可以用另外一种方式:
USE [QueueDB]
GO
ALTER PROCEDURE [dbo].[SP_SelectDriver_ByNameAndField] (
@Word Nvarchar(100)
, @Field TinyInt
) As Begin
Declare @Command Nvarchar(Max);
Select @Command = N'
Select *
From Driver
Where '
+ Case When @Field = 1
Then 'Column1'
When @Field = 2
Then 'Column2'
When @Field = 3
Then 'Column3'
Else 'DefaultColumn'
End
+ N' Like + N''%'
+ @Word
+ N'%'''
;
Execute (@Command);
Return 0;
END
-1。英语请... –
@flem提问者是伊朗人,我们所有人都有很多学习英语的问题。请耐心等待,我也会添加英文评论。只为你。 ;)干杯 – Rikki
谢谢穆罕默德,解决方案是如此有用,并帮助我,在此先感谢,Mamnoon;) – Moslem7026
您不能在SQL中使用动态列名称。
为了达到你想要的,你将需要使用dynamic SQL。链接的文章对此主题进行了全面的讨论。
如果不可能我该怎么办?为组合框中的每个项目编写存储过程? – Moslem7026
你可以这样做,或者你可以构造查询并将它传递给'sp_executeSql',或者如果你使用ADO.Net'command'类,它会为你做。但是,这假设了一些关于你的客户的事情我建议你调查Oded发布的链接。该网站的其他部分也非常翔实。 – Jodrell
您如何看待Sql Server中会预编译此查询计划?我建议使用动态SQL。什么将调用存储过程? – Jodrell