T-SQL 中需要两级参考
Need for two level reference in T-SQL
通过使用动态 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
的变量中的 int 值
您需要动态创建一个临时 table,并通过从中选择前 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
如果您粘贴所有代码,我们可能会尝试为您修改。
它应该与输出关键字一起使用。无需创建 table。我不知道,但你的代码不正确。您有输出参数@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),
通过使用动态 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
您需要动态创建一个临时 table,并通过从中选择前 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
如果您粘贴所有代码,我们可能会尝试为您修改。
它应该与输出关键字一起使用。无需创建 table。我不知道,但你的代码不正确。您有输出参数@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),