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

Sql server 如何让sp_executesql接受非nvarchar的参数值,sql-server,stored-procedures,sql-server-2012,dynamic-sql,sp-executesql,Sql Server,Stored Procedures,Sql Server 2012,Dynamic Sql,Sp Executesql,我正在尝试构建存储过程中的动态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_ex

我正在尝试构建存储过程中的动态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
参数上得到一个整数转换错误:

从dbo转换nvarchar值“SELECT*”时转换失败。Orders其中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

所以每次我想运行sp_executesql时,我都必须重新声明参数并再次设置它们的值?我把我的例子简化到最低限度。实际存储过程大约有10-15个参数。而且sp_executesql命令驻留在许多地方(由于IF/ELSE分支),所以每次我想运行sp_executesql时,我都必须重新声明参数并重新设置它们的值?我把我的例子简化到最低限度。实际存储过程大约有10-15个参数。sp_executesql命令驻留在许多地方(由于IF/ELSE分支)。是的,您需要分别重新定义sp_executesql的参数,因为它有自己的作用域,任何在其作用域之外声明的内容对sp_executesql都不可见。我明白了。作为一种解决方法,我将参数定义存储在一个变量中,例如
@SQLParamDef=N'@UserID int、@OrderID int等“
,只要在sp_executesql需要的地方重新使用该变量即可。似乎有用!