需要在T-SQL中进行两级引用

时间:2015-01-16 15:54:41

标签: sql ssms

通过使用动态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值

2 个答案:

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