我正在尝试构建存储过程中的动态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