0

私の検索ボックス

選択したコンボボックスアイテム(データベースのフィールド)の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

それは機能しません、あなたはこの検索方法をどのように行うことを提案しますか?

4

2 に答える 2

2

SQLでは動的列名を使用できません。

目的を達成するには、動的SQLを使用する必要があります。リンクされた記事には、この主題に関する包括的な議論があります。

于 2012-09-07T13:25:04.220 に答える
0

アジゼデル、

ComboBox hamishe baiangare LookUp ast ke hamanande Table eist ke 2 sotoune Id vaDescriptionrdarad。Agar gharar ast ke meghdare entekhabie ComboBox be StoredProcedure ferestade beshe、pishnahad mikonam az Id e Bind shode be SelectedValue e ComboBoxestefadebeshe。Nvarchar ro be SP ferestadan karedorostinist。

親愛なるサー/マダム、

ComboBoxは常に、IdとDescriberの2つの列しかないテーブルのような情報システムのLookUpの代わりになります。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
于 2012-09-07T13:28:05.677 に答える