Sql server 如何让sp_executesql接受非nvarchar的参数值
我正在尝试构建存储过程中的动态SQL语句。以下是它的简化版本: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
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需要的地方重新使用该变量即可。似乎有用!