如何使SP_EXECUTESQL接受不是NVarchar的参数值



我正在尝试构建存储过程中的动态SQL语句。这是它的简化版本:

CREATE PROC dbo.GetOrders
    @UserID INT = 2
AS
    DECLARE @SQLString NVARCHAR(MAX)
    SET @SQLString = N'(
                 SELECT * FROM dbo.Orders WHERE UserID = '+@UserID+'
                 )
    EXEC sys.sp_executesql @SQLString

我遇到的问题是sp_executesql仅与Unicode数据一起使用。因此,我在@UserID参数上遇到了一个转换错误:

转换在转换nvarchar值'select *从dbo.orders转换失败。

我必须在存储过程开始时声明我的参数,并且要为用户提供这些值。我到目前为止使用sp_executesql看到的示例显示了参数及其值在sp_executesql的运行时定义。这对我不起作用,因为我需要在同一存储过程的其他领域重复使用参数。

我该如何解决此问题,而无需指定我的所有参数为类型nvarchar

尝试这个...

CREATE PROC dbo.GetOrders
@UserID INT = 2
AS
BEGIN
  SET NOCOUNT ON;
  DECLARE @SQLString NVARCHAR(MAX);
    SET @SQLString = N' SELECT * FROM dbo.Orders ' 
                   + N' WHERE UserID = @UserID '

EXEC sp_executesql @SQLString
                   ,N'@UserID INT'
                   ,@UserID
END

或简单地使用以下

CREATE PROC dbo.GetOrders
@UserID INT = 2
AS
BEGIN
  SET NOCOUNT ON;
 SELECT * FROM dbo.Orders 
 WHERE UserID = @UserID 
END

尚不清楚为什么您在这里完全使用动态SQL,但这是正确的方法。

CREATE PROC dbo.GetOrders
@UserID INT = 2
AS
DECLARE @SQLString NVARCHAR(MAX)
SET @SQLString = N'SELECT * FROM dbo.Orders WHERE UserID = @UserID'
EXEC sys.sp_executesql @SQLString, N'@UserID int', @UserID= @UserID

相关内容

  • 没有找到相关文章

最新更新