将字段名称作为存储过程中的参数传递

时间:2012-09-07 13:23:02

标签: sql sql-server-2008 stored-procedures

My Search Box

我想在选定的组合框项目(DataBase中的字段)中搜索Word(文本框), 我的商店程序是:

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

它不起作用,你建议采用这种搜索方法的方式?

2 个答案:

答案 0 :(得分:2)

您无法在SQL中使用动态列名。

为了实现您的目标,您需要使用dynamic SQL。链接的文章对此主题进行了全面的讨论。

答案 1 :(得分:0)

Azize del,

ComboBox hamishe baiangare LookUp ast ke hamanande Table eist ke 2 sotoune Id va Describer darad。 Agar gharar ast ke meghdare entekhabie ComboBox be StoredProcedure ferestade beshe,pishnahad mikonam az Id e Bind shode be SelectedValue e ComboBox estefade beshe。 Nvarchar ro是SP ferestadan kare dorosti nist。

亲爱的先生/女士,

ComboBox始终是信息系统中LookUp的替代品,就像一个只有两列Id和Describer的Table。如果您要将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