【问题标题】:sql server parameter size overloadingsql server 参数大小重载
【发布时间】:2013-03-02 23:12:09
【问题描述】:

我正在从我的 ASP.NET 应用程序中调用一个存储过程。存储过程采用一个参数。我从我的 WEB 表单提供的值太大,以至于它没有完全加载到 sql server 的变量中。我的 sql 服务器参数的数据类型是 nvarchar(max),我的 ASP.NET 应用程序中的数据类型是字符串。 存储过程如下

Create procedure p_getProducts
@nm_emp nvarchar(max)
AS
BEGIN

  select * from tblProduct where nm_user in(convert(nvarchar(max),@nm_emp));

END

请告诉我应该使用哪种 sql server 数据类型来解决这个问题。

谢谢。

【问题讨论】:

  • 为什么要将变量转换为相同的数据类型?
  • 你这里有逻辑问题。以这种方式传递的参数不能将自身扩展为 IN 值列表。您的查询将永远无法工作。 (至少如果@nm_emp 类似于 'joe','mark','steve' 则不会)
  • @steve,是的,我正在格式化 c# 中的值,例如 'joe'、'mark'、'steve' 并将其保存在变量中并将其传递给存储过程。它们运行良好,但是当参数中的文本大小增加时,就会产生问题
  • @jw 我已经通过消除转换进行了尝试,但问题仍然存在。
  • 你确定吗?您是否尝试过使用多个名称并且结果包含两个名称?

标签: sql sql-server


【解决方案1】:

我可以从您的代码中推测,您应该使用dynamic-sql,而不是直接使用参数作为 IN 子句的值。试试这个过程。

Create procedure p_getProducts
      @nm_emp nvarchar(max)
AS
    BEGIN
    DECLARE @SQL NVARCHAR(MAX); 
    SELECT @SQL = N'select * from tblProduct where nm_user in(' + 
                  @nm_emp + N')'

    EXEC sp_executeSQL @SQL

【讨论】:

  • 只要他的参数不超过大约 3960 个 unicode 字符。 :)
  • 可能的 SQL 注入问题取决于 @nm_emp 中的值的来源。
  • @MartinSmith 如果他使用过程 ADO 函数从 ASP.NET 调用此函数,并且他可以设法进行安全调用,恕我直言。
  • 我没有说不可能,但据我们所知,它只是直接从Request.Form["MultiSelectListbox"]获取值
猜你喜欢
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多