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),