【问题标题】:Making query in stored procedure in SQL Server but some error occurs在 SQL Server 中的存储过程中进行查询,但出现一些错误
【发布时间】:2013-09-14 11:40:15
【问题描述】:

我的存储过程如下所示:

Alter PROCEDURE [dbo].[productfilter_whatsnew]
   @query1 nvarchar(max),
   @query2 nvarchar(max),
   @date date,
   @pid varchar(5)
AS
   select * 
   FROM Productcolorimage pci  
   where entry_date > @date 
     and selectproduct = @pid + ' ' + @query1 
   order by @'@query2'
GO

我的函数传值

public DataTable productfilter_whatsnew(ProductBAL objbal)
{
    DataTable dt = new DataTable();

    using (SqlConnection conn = new SqlConnection(strconn))
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand("productfilter_whatsnew", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter[] para = {
                               new SqlParameter("@query1","and colorid in('3')"),
                                new SqlParameter("@query2","pid ASC"),
                                new SqlParameter("@date","14-09-2013"),
                                new SqlParameter("@pid","1")
                              };
        try
        {
            cmd.Parameters.AddRange(para);
            SqlDataAdapter d = new SqlDataAdapter(cmd);
            d.Fill(dt);
            conn.Close();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    return dt;
}

但在放置 @query1@query2 时显示不同的错误...

【问题讨论】:

  • @rene 不知道这样做?

标签: c# asp.net sql-server-2008 stored-procedures


【解决方案1】:

如果您确定要这样做,请使用动态 SQL。但请务必先阅读SQL Injection

alter procedure [dbo].[productfilter_whatsnew]
(
    @query1 nvarchar(max),
    @query2 nvarchar(max),
    @date date,
    @pid varchar(5)
)
as
begin
    declare @stmt nvarchar(max)

    select @stmt= '
        select * 
        from Productcolorimage as pci
        where entry_date > @date and selectproduct = @pid'

    select @stmt = @stmt + ' ' + @query1
    select @stmt = @stmt + ' order by ' + @query2

    -- passing parameters into sp by names, easier to maintain in the future
    exec sp_executesql
        @stmt = @stmt,
        @params = N'@date date, @pid varchar(5)',
        @date = @date,
        @pid = @pid;
end

【讨论】:

    【解决方案2】:

    如果你真的需要,你可以改变你的程序来调用sp_executesql。您确定不能使用 Entity Framework 或 NHibernate 或任何其他 ORM 库吗?

    Alter PROCEDURE [dbo].[productfilter_whatsnew]
    @query1 nvarchar(max),
    @query2 nvarchar(max),
    @date date,
    @pid varchar(5)
    AS
    BEGIN
        declare @sql nvarchar(1000)
        declare @ParmDefinition nvarchr(1000)
        SET @ParmDefinition = N'@date date, @pid varchar(5)';
    
        set @sql = N'select * FROM Productcolorimage pci  where entry_date>@date and selectproduct=@pid ' + @query1 + ' order by ' + @query2
    
        EXECUTE sp_executesql @sql, @ParmDefinition, @date=@date, @pid=@pid;
    END
    GO
    

    【讨论】:

    • 你忘了定义和传递@params参数吗?
    • 出现错误“必须声明标量变量“@SQLString”。”
    • 如何解决这个问题??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2014-01-22
    • 2018-10-04
    • 1970-01-01
    • 2022-10-07
    • 2013-06-15
    相关资源
    最近更新 更多