3

ストアドプロシージャがあります

create PROCEDURE [dbo].[SP] 
(
    @OrderList varchar(500)
)
AS
Begin
    select * 
    from table 
    where id in ('+ @OrderList +')

ここで私はオーダーリストを渡しています....

このように実行すると

exec sp 'iss005,iss006'

データを取得していません

しかし、このようにspでハードコーディングすると...

   select * from table where id in ('iss005','iss006')

それからデータを取得しています...

ありがとうございました

4

3 に答える 3

5

残念ながら、そのようには機能しません。手順を次のように変更すると、これが機能します。

Create Procedure dbo.SP
    @OrderList varchar(500)
AS

Declare @SQL VarChar(1000)

Select @SQL = 'SELECT * FROM table '
Select @SQL = @SQL + 'WHERE id in (' + @OrderList +')'

Exec ( @SQL)

GO

クエリをさらに詳しく調べると、ID の値varcharが得られるため、手順は失敗します。

WHERE id in (iss005,iss006)

君が望む時に :

WHERE id in ('iss005','iss006')

次のように、引用符の値を渡す必要があります。

@OrderList = 'iss005','iss006'

@OrderListまたは、コンマで分割する SQL を作成し、QUOTENAME()関数を使用して新しい変数に引用符を追加します。

于 2012-12-19T08:37:59.443 に答える
0

私も同じような要望がありました。私は int リスト変数でユーザーのリストを取得していましたが、それらのユーザーのすべての順序を取得する必要があります。私の問題を解決した非常に単純なトリックを使用しました。コードを見つけてください。

public DataTable GetAllOrderData(List<int> UserID)
    {
        try
        {
            string listofuser = String.Join(",", UserID.ToArray());
            SqlParameter[] parameters = new SqlParameter[]
            {                
                new SqlParameter("@USERID", listofuser)
            };
            return SqlDBHelper.ExecuteParamerizedSelectCommand("GetOrderByUserID", System.Data.CommandType.StoredProcedure, parameters);
        }
        finally { UserID = null; }

    }

そして、これはストアドプロシージャです

CREATE PROCEDURE [dbo].[GetOrderByUserID] (@USERID varchar(700))
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
Declare @SQL VarChar(1000)
Select @SQL = 'SELECT *,ORM.OrganisationName FROM OrderTransaction ORT LEFT JOIN OrganisationMaster ORM ON (ORT.OrganisationID=ORM.OrganisationID) '
Select @SQL = @SQL + 'WHERE ORT.CreatedBy IN (' + @USERID +')'

Exec ( @SQL)
END
于 2016-12-30T11:08:07.190 に答える