Sql server 在sql server中,如果使用exec语句在过程中运行某些动态sql,如何将结果作为输出参数检索

Sql server 在sql server中,如果使用exec语句在过程中运行某些动态sql,如何将结果作为输出参数检索,sql-server,stored-procedures,Sql Server,Stored Procedures,我不确定我的问题是否写得好;我肯定以前有人问过,但我没找到 在一个过程中,我使用EXEC创建并运行一些动态SQL来创建一个大的CSV字符串。问题是,如果我将结果放入EXEC中的nvarchar(max)变量中,它不在PROC范围内,那么如何通过过程的输出变量获取返回值 我猜我在某种程度上把这整件事搞错了:o) 下面是我的实际代码(尽管如果需要,我可以生成一个不太复杂的示例,并解释为什么它复杂): 使用而不是EXEC(),并从动态SQL中删除该声明,然后传递。一个简单的例子是: DECLARE @

我不确定我的问题是否写得好;我肯定以前有人问过,但我没找到

在一个过程中,我使用EXEC创建并运行一些动态SQL来创建一个大的CSV字符串。问题是,如果我将结果放入EXEC中的nvarchar(max)变量中,它不在PROC范围内,那么如何通过过程的输出变量获取返回值

我猜我在某种程度上把这整件事搞错了:o)

下面是我的实际代码(尽管如果需要,我可以生成一个不太复杂的示例,并解释为什么它复杂):

使用而不是
EXEC()
,并从动态SQL中删除该声明,然后传递。一个简单的例子是:

DECLARE @SQL NVARCHAR(MAX) = 'SELECT @i = 1;';
DECLARE @i INT;
EXECUTE sp_executesql @SQL, N'@i INT OUTPUT', @i OUTPUT;

SELECT  @i;
在查看动态SQL之后,您还应该使用输入参数,而不是:

set @SQL = @SQL + ' where b.FORMID = ' + cast(@FORMID as nvarchar(15)) + ' ...'
简单使用

SET @SQL = @SQL + ' WHERE b.FormID = @FormID '
然后将
@FormID
传递给sp_executesql:

EXECUTE sp_executesql @SQL, N'@FormID INT, @i INT OUTPUT', @FormID, @i OUTPUT;
附录

使用输入参数对日期更为重要,您有:

SET @SQL = @SQL + ' and b.RDATE between cast(''' + @STARTDATE  + '''as nvarchar(20)) and cast(''' + @ENDDATE + ''' as nvarchar(20))) rf ';  
这是显式地将@StartDate(出于某种模糊的原因实际上是nvarchar)转换为
nvarchar(20)
,只是隐式地将其转换为一个日期,以便与
b.RDATE
进行比较。这只是询问转换错误!将
@StartDate
@EndDate
参数设置为
DATETIME
类型,再次在动态SQL中使用参数:

SET @SQL = @SQL + ' WHERE b.FormID = @FormID AND b.RDate BETWEEN @StartDate AND @EndDate ';
EXECUTE sp_executesql 
        @SQL, 
        N'@FormID NUMERIC(38,0), @StartDate DATETIME2, @EndDate DATETIME2', 
        @FormID,
        @StartDate,
        @EndDate;
现在,您的stronly类型参数不易发生转换错误或错误的sql

使用而不是
EXEC()
,并从动态SQL中删除该声明,然后传递。一个简单的例子是:

DECLARE @SQL NVARCHAR(MAX) = 'SELECT @i = 1;';
DECLARE @i INT;
EXECUTE sp_executesql @SQL, N'@i INT OUTPUT', @i OUTPUT;

SELECT  @i;
在查看动态SQL之后,您还应该使用输入参数,而不是:

set @SQL = @SQL + ' where b.FORMID = ' + cast(@FORMID as nvarchar(15)) + ' ...'
简单使用

SET @SQL = @SQL + ' WHERE b.FormID = @FormID '
然后将
@FormID
传递给sp_executesql:

EXECUTE sp_executesql @SQL, N'@FormID INT, @i INT OUTPUT', @FormID, @i OUTPUT;
附录

使用输入参数对日期更为重要,您有:

SET @SQL = @SQL + ' and b.RDATE between cast(''' + @STARTDATE  + '''as nvarchar(20)) and cast(''' + @ENDDATE + ''' as nvarchar(20))) rf ';  
这是显式地将@StartDate(出于某种模糊的原因实际上是nvarchar)转换为
nvarchar(20)
,只是隐式地将其转换为一个日期,以便与
b.RDATE
进行比较。这只是询问转换错误!将
@StartDate
@EndDate
参数设置为
DATETIME
类型,再次在动态SQL中使用参数:

SET @SQL = @SQL + ' WHERE b.FormID = @FormID AND b.RDate BETWEEN @StartDate AND @EndDate ';
EXECUTE sp_executesql 
        @SQL, 
        N'@FormID NUMERIC(38,0), @StartDate DATETIME2, @EndDate DATETIME2', 
        @FormID,
        @StartDate,
        @EndDate;
现在,您的stronly类型参数不易发生转换错误或错误的sql

使用而不是
EXEC()
,并从动态SQL中删除该声明,然后传递。一个简单的例子是:

DECLARE @SQL NVARCHAR(MAX) = 'SELECT @i = 1;';
DECLARE @i INT;
EXECUTE sp_executesql @SQL, N'@i INT OUTPUT', @i OUTPUT;

SELECT  @i;
在查看动态SQL之后,您还应该使用输入参数,而不是:

set @SQL = @SQL + ' where b.FORMID = ' + cast(@FORMID as nvarchar(15)) + ' ...'
简单使用

SET @SQL = @SQL + ' WHERE b.FormID = @FormID '
然后将
@FormID
传递给sp_executesql:

EXECUTE sp_executesql @SQL, N'@FormID INT, @i INT OUTPUT', @FormID, @i OUTPUT;
附录

使用输入参数对日期更为重要,您有:

SET @SQL = @SQL + ' and b.RDATE between cast(''' + @STARTDATE  + '''as nvarchar(20)) and cast(''' + @ENDDATE + ''' as nvarchar(20))) rf ';  
这是显式地将@StartDate(出于某种模糊的原因实际上是nvarchar)转换为
nvarchar(20)
,只是隐式地将其转换为一个日期,以便与
b.RDATE
进行比较。这只是询问转换错误!将
@StartDate
@EndDate
参数设置为
DATETIME
类型,再次在动态SQL中使用参数:

SET @SQL = @SQL + ' WHERE b.FormID = @FormID AND b.RDate BETWEEN @StartDate AND @EndDate ';
EXECUTE sp_executesql 
        @SQL, 
        N'@FormID NUMERIC(38,0), @StartDate DATETIME2, @EndDate DATETIME2', 
        @FormID,
        @StartDate,
        @EndDate;
现在,您的stronly类型参数不易发生转换错误或错误的sql

使用而不是
EXEC()
,并从动态SQL中删除该声明,然后传递。一个简单的例子是:

DECLARE @SQL NVARCHAR(MAX) = 'SELECT @i = 1;';
DECLARE @i INT;
EXECUTE sp_executesql @SQL, N'@i INT OUTPUT', @i OUTPUT;

SELECT  @i;
在查看动态SQL之后,您还应该使用输入参数,而不是:

set @SQL = @SQL + ' where b.FORMID = ' + cast(@FORMID as nvarchar(15)) + ' ...'
简单使用

SET @SQL = @SQL + ' WHERE b.FormID = @FormID '
然后将
@FormID
传递给sp_executesql:

EXECUTE sp_executesql @SQL, N'@FormID INT, @i INT OUTPUT', @FormID, @i OUTPUT;
附录

使用输入参数对日期更为重要,您有:

SET @SQL = @SQL + ' and b.RDATE between cast(''' + @STARTDATE  + '''as nvarchar(20)) and cast(''' + @ENDDATE + ''' as nvarchar(20))) rf ';  
这是显式地将@StartDate(出于某种模糊的原因实际上是nvarchar)转换为
nvarchar(20)
,只是隐式地将其转换为一个日期,以便与
b.RDATE
进行比较。这只是询问转换错误!将
@StartDate
@EndDate
参数设置为
DATETIME
类型,再次在动态SQL中使用参数:

SET @SQL = @SQL + ' WHERE b.FormID = @FormID AND b.RDate BETWEEN @StartDate AND @EndDate ';
EXECUTE sp_executesql 
        @SQL, 
        N'@FormID NUMERIC(38,0), @StartDate DATETIME2, @EndDate DATETIME2', 
        @FormID,
        @StartDate,
        @EndDate;

现在,您的stronly类型参数不易发生转换错误或错误的sql

您需要使用才能将输出pramas与动态sql一起使用。A当然受欢迎。您需要使用才能将输出pramas与动态sql一起使用。A当然受欢迎。您需要使用才能将输出pramas与动态sql一起使用。A当然受欢迎。您需要使用才能使用使用动态sql.A输出pramas当然是受欢迎的。谢谢GarethD。参数化是我克服这个障碍后的下一个目标。我只是在约会中使用nvarchar来减少创建动态SQL所需的转换,以便在参数化的同时重新访问它。谢谢GarethD。参数化是我克服这个障碍后的下一个目标。我只是在约会中使用nvarchar来减少创建动态SQL所需的转换,以便在参数化的同时重新访问它。谢谢GarethD。参数化是我克服这个障碍后的下一个目标。我只是在约会中使用nvarchar来减少创建动态SQL所需的转换,以便在参数化的同时重新访问它。谢谢GarethD。参数化是我克服这个障碍后的下一个目标。我只是在我的约会中使用nvarchar来减少创建动态SQL所需的转换,以期在参数化的同时重新审视这一点。