通过使用动态SQL,我创建了一个如下变量名:
set @tempresultStore = 'Temp'+@colVar
现在,@tempresultstore
的值为'TempMiddleName',然后我声明了这个名为TempMiddleName的变量,并在动态sql查询中的同一行中赋值并执行。
代码如下:(向下滚动到代码行,注释以跟踪问题所在的位置)
CREATE Procedure OutputProcedure
@LastNameFromUser nvarchar(20) = null,
@LastNameFromTable nvarchar(20),
@MiddleNameFromUser nvarchar(20) = null,
@MiddleNameFromTable nvarchar(20) = null,
@CityFromUser nvarchar(20) = null,
@CityFromTable nvarchar(20) = null,
@Percentage int out
AS
BEGIN
SELECT @MiddleNameFromTable AS'middlename'
select @LastNameFromTable as 'LASTNAMEFROMTABLE'
select @LastNameFromUser as 'LASTNAMEFROMUser'
select 'OUTPUTPROCEDURECALLED'
declare @maxvalue int , @finalpercentage int = 0
DECLARE @variableTable TABLE
(
idx int identity(1,1),
matchvalue nvarchar(15)
)
INSERT INTO @variableTable(matchvalue) values ('MiddleName')
INSERT INTO @variableTable(matchvalue) values ('LastName')
INSERT INTO @variableTable(matchvalue) values ('City')
SELECT * FROM @variableTable
DECLARE @counter int
declare @sql nvarchar(100)
declare @sql2 nvarchar(25), @finalResult nvarchar(100)
set @finalResult = 0;
declare @sql3 nvarchar(300), @sql4 nvarchar(15), @tempresultStore nvarchar(20), @temp int, @temp2 int, @average int
DECLARE @ParmeterDefinition nvarchar(500);
set @ParmeterDefinition =
N'@LastNameFromUsnvarchar(20),
@LastNameFromTab nvarchar(20),
@MiddleNameFromUs nvarchar(20),
@MiddleNameFromTab nvarchar(20),
@CityFromUs nvarchar(20),
@CityFromTab nvarchar(20),
@Percent int out'
SET @counter = 1
SELECT @maxvalue = (SELECT MAX(idx) FROM @variableTable)
select @maxvalue as 'MAXVALUE'
WHILE(@counter < @maxvalue)
BEGIN
DECLARE @colVar nvarchar(15)
SELECT @colVar = matchvalue FROM @variableTable WHERE idx = @counter
set @tempresultStore = 'Temp'+@colVar --here
SELECT @tempresultStore AS 'FINALCUTPART'
select 'JUSTBEFORSQL'
set @sql3 = 'declare @Temp' + @colVar + ' int = dbo.[Match' + @colVar + '](' + @colVar + 'FromUser,' + @colVar + 'FromTable, 0)'
select @sql3 as 'check sql query formed'
EXEC sp_executesql @sql3,
@ParmeterDefinition,
@LastNameFromUs = @LastNameFromUser,
@LastNameFromTab = @LastNameFromTable,
@MiddleNameFromUs = @MiddleNameFromUser,
@MiddleNameFromTab = @MiddleNameFromTable,
@CityFromUs = @CityFromUser,
@CityFromTab = @CityFromTable,
@Percent = @Percentage out
select @Percentage AS 'PERCENTRETRIVED'
set @finalResult = @finalResult + @Percentage /*here @Percentage always remains 0. It is the value returned by the UDF called by the dynamic SQL above.The function does return the value but probably I fail to store it correctly.*/
select @finalResult as 'SUM'
SET @counter = @counter + 1
select @counter as 'COUNTERVALUE'
END
set @finalpercentage = @finalResult/@maxvalue
SELECT @finalpercentage AS 'FINALRESULT'
RETURN
END
Go
如何访问存储在名为@TempMIddleName
答案 0 :(得分:0)
您需要动态创建临时表,并通过从中选择前1个值来访问它的值。像下面这样的东西;
CREATE TABLE #ResultValue (Value Varchar(200))
DECLARE @DynamicSql NVarchar(MAX) = ''
SELECT @DynamicSql = '
DECLARE @tempresultStore Varchar(50)
DECLARE @colVar Varchar(50) = ''MiddleName''
SET @tempresultStore = ''Temp'' + @colVar
insert into #ResultValue
select @tempresultStore
'
EXEC sp_sqlexec @DynamicSql
SELECT * FROM #ResultValue
DROP TABLE #ResultValue
如果您粘贴所有代码,我们可能会尝试为您修改。
答案 1 :(得分:0)
它应该与output关键字一起使用。无需创建表格。我不知道,但你的代码不正确。你有输出参数@Percent并将函数值赋给@TempMiddleName,那么你应该没有@Percent作为输出而是@TempMiddleName。
你得到动态SQL
declare @TempMiddleName int = dbo.[MatchMiddleName](MiddleNameFromUser,MiddleNameFromTable, 0)
我曾经回答过你,你在变量之前错过了@
。
此外,您还为动态查询提供了变量@Percent(以及其他变量),但您没有为其分配任何值。尝试更改
SET @sql3 = 'declare @Temp' + @colVar + ' int = dbo.[Match' + @colVar + '](' + @colVar + 'FromUser,' + @colVar + 'FromTable, 0)'
到
SET @sql3 = 'select @Percent = 1'
你会看到1应该按原样返回。
此处您还有错误。从类型
中拆分第一个参数set @ParmeterDefinition =
N'@LastNameFromUsnvarchar(20),
set @ParmeterDefinition =
N'@LastNameFromUs nvarchar(20),