如何让 sp_executesql 接受非 nvarchar 的参数值

How to get sp_executesql to accept parameter values that are not 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 参数上遇到转换错误:

Conversion failed when converting the nvarchar value 'SELECT * FROM dbo.Orders WHERE UserID = '

我必须在存储过程开始时声明我的参数,以便用户提供这些值。到目前为止,我看到的使用 sp_executesql 的示例显示了在 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, N'@UserID int', @UserID= @UserID

试试这个...

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