0

我正在尝试构建一个存储过程中的动态 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 * FROM dbo.Orders WHERE UserID = ' 时转换失败

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

如果不将所有参数指定为 type ,我怎么能解决这个问题nvarchar

4

2 回答 2

1

目前尚不清楚您为什么在这里使用动态 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
于 2015-05-12T23:22:20.067 回答
1

尝试这个...

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
于 2015-05-12T23:24:16.840 回答