Determining Column name involve in Functional Index

I write this query to know about the existing indexes of all tables pertains to a schema. My problem is when index is functional one, column name is not descriptive, it is like SYS_NC00047$, ..... as yet i could not find the way to know exact column name in the out put of this query. your help is required..
SELECT index_owner,
         index_name,
         table_owner,
         table_name,
         column_name,
         column_position,
         column_length
    FROM dba_ind_columns
   WHERE index_owner = 'CORE_BUSINESS'
ORDER BY table_name               ;

Use DBA_IND_EXPRESSIONS or USER_IND_EXPRESSIONS.
See this example :
SQL> drop table X_1 purge;
Table dropped.
SQL>  create table X_1 (col_1  varchar2(5), col_2 number);
Table created.
SQL> create index X_1_UPPER_COL_1 on X_1(upper(col_1));
Index created.
SQL> set long 20000
SQL> select column_expression from user_ind_expressions
  2  where index_name = 'X_1_UPPER_COL_1';
COLUMN_EXPRESSION
UPPER("COL_1")
SQL>Note : COLUMN_EXPRESSION is a LONG datatype and SET LONG defaults to 80 in SQLPlus, thus it will only show the first 80 characters of the expression unless you SET LONG to a higher value.
Hemant K Chitale

Similar Messages

  • Using Column Name returned by function in SELECT statement

    Hi
    Output from my function (RETURN data type is VARCHAR2) is column name. I want to use it directly in my SELECT statement. Below is simplified example of this:
    --- Function
    CREATE OR REPLACE FUNCTION simple RETURN varchar2 IS
    BEGIN
    RETURN ‘my_column’;
    END simple;
    --- Select
    SELECT simple FROM my_table;
    This does not work. It seems that output from function is passed in quotation i.e.
    SELECT ‘my_column’ FROM my_table;
    So the output from SELECT is a list of rows populated with values my_table:
    COLUMN     simple
    ROW1     my_column
    ROW2     my_column
    ROW3     my_column
    Can please someone help me with this?

    I'm not sure I got you right.
    In standard SQL everything must be known at compile time. If not dynamic SQL is required, but is a costly operation (usually requires parsing before each execution) so it should better not be used when standard SQL can do it.
    I provided a design time example where a function returns the column name from the given the table name and column id for a varchar2 column data type to make things simple. Then a query string is constructed and executed dynymically to return all column values of the chosen table_name.column_name.
    SELECT simple FROM my_tableAt compile time the simple function return value is unknown (any varchar2 value would do) you already find out you get the (same) return value (i.e column name) for each table row => dynamic SQL needed to get the column values
    The purpose of function would be to rename all columns for provided table.The table name would be provided, right? If yes => dynamic SQL
    What is the function supposed to return the column name (where would the new name come from?), the column alias (which table column would be renamed to the new name?)
    The user could use the new_column name as the column alias name submitting the query.
    Is it possible to do this?Maybe () using a pipelined function (different data types - number,date, ... not cosidered yet) but your simple query;
    <tt>SELECT simple FROM my_table</tt>
    might look like:
    <tt>select my_column_value new_column_name from table(get_column_value(table_name,column_name))</tt>
    Sorry, no Database at hand to provide a specific example.
    Regards
    Etbin

  • Need to return dynamic column names for a function returning nested table

    I am having a pl/sql function which is returning a nested table.
    For this i have defined an object which is having 4 attributes- 1 number type, 3 varchar2 type -p1,p2,p3.
    My function is taking input parameter v1,v2,v3 all of varchar2 type.Inside the function body,i am using these (v1,v2,v3) to filter data from an sql query and i am also
    using pivot function in this sql query.
    At the end my function is returning the object as defined in the starting .
    When i am excuting this function,thru select statement :
    select * from table(f1_test('A','B','C'));
    i am geting p1,p2,p3 as column name ,which are names used when i had defined object type.Instead i want column name to be dynamic (wotever i am passing in function as
    parameter while executing the function ,here A,B,C)
    Please help me in geting column names dynamic as passed in input parameter (i.e A,B,C for this case )
    Sample code for the problem:
    create or replace TYPE obj1 AS OBJECT
    ( id number(5,0)
    ,p1 varchar2(10),
    ,p2 varchar2(10)
    ,p3 varchar2(10)
    create or replace TYPE tt1 AS TABLE OF OBJ1;
    create or replace
    function f1_test (v1 varchar2,v2 varchar2,v3 varchar2)
    return tt1 as
    v_return tt1 ;
    v_str varchar2(30000);
    begin
    v_str:='
    select
    cast(
    multiset(
    select * from
    select
    aa.report_id
    ,cc.name
    ,e.amount
    from
    aa,cc,e
    where
    <join conditions>
    and cc.name in ('''||v1||''','''||v2||''','''||v3||''')
    pivot (sum (amount) for name in ('''||v1||''' as '||v1||','''||v2||''' as '||v2||','''||v3||''' as '||v3||'))
    as tt1)
    from
    dual';
    dbms_output.put_line(v_str);
    execute immediate v_str
    into
    v_return ;
    return v_return;
    end;
    Edited by: 845831 on 20 Mar, 2011 12:15 PM

    select id,p1 A,p2 B,p3 C from table(f1_test('A','B','C'));
    drop function f1_test;
    drop type tt1;
    drop type obj1;
    create or replace TYPE obj1 AS OBJECT
    ( id number(5,0)
    ,p1 varchar2(10)
    ,p2 varchar2(10)
    ,p3 varchar2(10)
    create or replace TYPE tt1 AS TABLE OF OBJ1;
    CREATE OR REPLACE
      FUNCTION f1_test(
          v1 VARCHAR2,
          v2 VARCHAR2,
          v3 VARCHAR2)
        RETURN tt1
      AS
        v_return tt1 ;
        v_str VARCHAR2(30000);
      BEGIN
        v_str:='select cast(multiset(select 1,''20'',''30'',''40'' from dual) as tt1) from dual';
        dbms_output.put_line(v_str);
        EXECUTE immediate v_str INTO v_return ;
        RETURN v_return;
      END;
    /

  • Determining column name at runtime

    I have created a function that accepts a number of parameters, passes these values into a cursor which retrieves the appropriate values from the database and then I do my processing based on what the database returns. The specific problem here is that I need to look at each column in the table individually, but I don't want to hard-code the column name in my cursor. The cursor I tried to use for this purpose is below for your reference. It appears that I get the correct value returned from the query I aliased as B. If I run the statement below with the B.column_name hard-coded as q1000 (one of the actual column names), I get no rows returned which is the answer I'm looking for. However, it doesn't appear to be using the returned q1000 from query B and substituting that for B.column_name, so I get 1 row returned. I also looked at using Dynamic SQL and either I'm doing it wrong, or it isn't the correct solution to my problem. Any help would be appreciated. :)
    CURSOR current_diary_cur IS
    SELECT d.dmonth, d.dday
    FROM p2_diary d, form_log f, (SELECT column_name
                             FROM all_tab_columns
                        WHERE table_name = 'P2_DIARY'
                             AND column_name = p_diary_field) B
    WHERE d.form_seq = f.form_seq
    AND f.subj_seq = p_subj_seq
    AND f.visit_num = p_cur_vnum
    AND d.dmonth = p_dmonth
    AND d.dday = p_dday
    AND B.column_name IS NOT NULL;

    One of my co-workers said something that made me realize a mistake I made in the post below. I am actually trying to do this in a Forms library and not Procedure Builder. We are using Forms version 6.0.8.11.3. Am I not able to use Dynamic SQL in this version of Forms?
    Thanks for your reply. I tried to use the example you gave me and ran into compiler problems. So, I tried another example from Oracle8i Application Developer's Guide - Fundamentals Release 2 (8.1.6) documentation on Dynamic SQL - the function is listed below. When I tried to compile it, the compiler error I got was Encountered the symbol "STMT_STR" when expecting one of the following: select. This error occurs at the line where you open the cursor. This is the same message when I tried your code also. Am I doing something wrong, is my system not set up to handle this or is there some other problem I'm having? I'm trying to do this through Proc Builder and not at the command line...does this make a difference? Help!
    FUNCTION my_func
    return number
    is
    TYPE EmpCurTyp IS REF CURSOR;
    cur EmpCurTyp;
    stmt_str VARCHAR2(200);
    name VARCHAR2(20);
    salary NUMBER;
    BEGIN
    stmt_str := 'SELECT ename, sal FROM emp
    WHERE job = :1';
    OPEN cur FOR stmt_str USING 'SALESMAN';
    LOOP
    FETCH cur INTO name, salary;
    EXIT WHEN cur%NOTFOUND;
    -- <process data>
    END LOOP;
    CLOSE cur;
    END;

  • How to know the column name using the index name for a particular table

    Hi All,
    I have small query regarding, I have index name and table name so by using this how can I know the column name associated with that index of that particular table specific to Oracle9i.
    Thanks
    Sudheer

    select *
    from user_ind_columns -- or all_ind_columns
    where table_name = UPPER('&table_name')
    and index_name = UPPER('&index_name');
    Regards
    Arun
    Gurgaon

  • Using variable coulmn name in sql function

    Hi there,
    I am not an expert with PL/SQL and I can not figure out how to use variable column names in my function.
    My function is:
    CREATE OR REPLACE FUNCTION RESET_TRIGGERS(aTrigger VARCHAR2) RETURN NUMBER IS
    TEMP_ID NUMBER;
    TEMP_USER_ID NUMBER;
    BEGIN
    SELECT 'LIMS.'||'$aTrigger'||'.NEXTVAL' INTO TEMP_ID FROM DUAL;
    SELECT 'LIMS.'||'$aTrigger'||'_USER.NEXTVAL' INTO TEMP_USER_ID FROM DUAL;
    IF TEMP_ID > TEMP_USER_ID THEN
    LOOP
    SELECT LIMS.SQ_U_FINALRESULT_USER.NEXTVAL INTO TEMP_USER_ID FROM DUAL;
    EXIT WHEN TEMP_USER_ID = TEMP_ID;
    END LOOP;
    ELSE
    WHILE TEMP_ID < TEMP_USER_ID LOOP
    SELECT LIMS.SQ_U_FINALRESULT.NEXTVAL INTO TEMP_ID FROM DUAL;
    END LOOP;
    END IF;
    COMMIT;
    RETURN (TEMP_ID);
    END;
    What I want is that I pass a seqencename with aTrigger and that two triggers will be equal if not.
    eg ifaTrigger = 'SQ_U_FINALRESULT'
    than I want the triggers LIMS.SQ_U_FINALRESULT and LIMS.SQ_U_FINALRESULT_USER to be set equal.
    The above function will not work, but what will?????
    I hope you can help me out!
    Cheers

    A very strange function indeed.
    But here is what I think he meant to do:
    SQL> create procedure reset_sequences
      2  ( p_sequence_name in  varchar2
      3  , p_nextval          out number
      4  )
      5  is
      6    l_nextval1 number;
      7    l_nextval2 number
      8    ;
      9    procedure reset_sequence_value
    10    ( p_sequence_name in varchar2
    11    , p_current_value in number
    12    , p_new_value     in number
    13    )
    14    is
    15      l_dummy number;
    16    begin
    17      execute immediate 'alter sequence ' || p_sequence_name || ' increment by ' || to_char(p_new_value-p_current_value);
    18      execute immediate 'select ' || p_sequence_name || '.nextval from dual' into l_dummy;
    19      execute immediate 'alter sequence ' || p_sequence_name || ' increment by 1';
    20    end reset_sequence_value
    21    ;
    22  begin
    23    execute immediate
    24      'select ' || p_sequence_name || '.nextval,' || p_sequence_name || '_user.nextval from dual'
    25    into l_nextval1, l_nextval2
    26    ;
    27    if l_nextval1 < l_nextval2
    28    then
    29      reset_sequence_value(p_sequence_name,l_nextval1,l_nextval2);
    30    end if
    31    ;
    32    if l_nextval1 > l_nextval2
    33    then
    34      reset_sequence_value(p_sequence_name || '_user',l_nextval2,l_nextval1);
    35    end if
    36    ;
    37    p_nextval := greatest(l_nextval1,l_nextval2)
    38    ;
    39  end reset_sequences;
    40  /
    Procedure is aangemaakt.
    SQL> show err
    Er zijn geen fouten.
    SQL> create sequence testseq start with 5 increment by 1
      2  /
    Reeks is aangemaakt.
    SQL> create sequence testseq_user start with 2 increment by 1
      2  /
    Reeks is aangemaakt.
    SQL> declare
      2    l_new_value number;
      3  begin
      4    reset_sequences('testseq',l_new_value);
      5    dbms_output.put_line(l_new_value);
      6  end;
      7  /
    5
    PL/SQL-procedure is geslaagd.
    SQL> select testseq.currval from dual
      2  /
                                   CURRVAL
                                         5
    1 rij is geselecteerd.
    SQL> select testseq_user.currval from dual
      2  /
                                   CURRVAL
                                         5
    1 rij is geselecteerd.Regards,
    Rob.

  • Finding name of *calling* function

    Hi,
    Is there any way to determine the name of the function that called a base class function?
    Example:
    class base {
       protected void func(String msg) {
          // who called me (derived f1 or f2)?
    class derived extends base {
       public void f1() {
          func("some text");
       public void f2() {
          func("some text");
    }I could do something like:
       protected void func(String msg) {
          // who called me (derived f1 or f2)?
          try {
             throw new Exception();
          catch () {
             // walk call stack...
       }But this doesn't pass the smell test...
    I want this check to be completely passive to the caller, so having the caller pass some value to the base func isn't an option. I want to take a slightly different action in the base func based upon who is calling me.
    Thanks,
    Ken

    I want to take a slightly different action in the base func based upon
    who is calling me.That smells big times; a super class is not supposed to know whether
    or not it is extended and if so by what. Better go for a strategy approach
    or even a simple command pattern.
    If you really want to do it cheapo, define the base class as abstract and
    mix in the 'slightly different' functionalities as abstract methods which
    are implemented by the sub classes.
    kind regards,
    Jos

  • Actual Column Name for Index when Function is used?

    Hi,
    We have some indeces where the column in oracle is actually a function in the form UPPER('column-name'). When I query user_ind_columns I get something like SYS_NC0012$ for the column name. Where would I be able to actually query the actual column it's using in the index? So that I can query the exact column name if need be. Don't ask why cause this is a developer asking me this and they are doing some sort of a comparison between indexes between two application.
    Here is the SQL for the Index and the Table associated with it
    create table BATCH_HEADER2
    PAYMENT_TYPE VARCHAR2(17),
    BATCH_TYPE VARCHAR2(40) not null,
    BATCHNUM NUMBER not null,
    BRANCH VARCHAR2(16),
    BATCH_TIME NUMBER,
    USER_LOB VARCHAR2(16),
    PAYEE_TYPE VARCHAR2(40),
    PROGRESS_RECID NUMBER,
    CHEQUE_TYPE VARCHAR2(60),
    SCANNERBATCHNO NUMBER,
    RECEIPTCOUNT NUMBER
    alter table BATCH_HEADER2
    add constraint PK_BATCH_HEADER2 primary key (BATCH_TYPE, BATCHNUM)
    using index
    tablespace FT1_DATA;
    --Inxes
    create unique index FT1DSTINT.BATCH_HEADER2##BYNUM on FT1DSTINT.BATCH_HEADER2 (UPPER(BATCH_TYPE), BATCHNUM)
    tablespace FT1_DATA
    pctfree 10
    initrans 2
    maxtrans 255
    storage (initial 64K
    minextents 1
    maxextents unlimited);

    From Oracle's standpoint, though, it isn't indexing BATCH_TYPE. It's indexing an arbitrary function that happens to take BATCH_TYPE as an input. As far as Oracle is concerned, you might just as easily be indexing an expression that took a dozen column names as parameters, so it doesn't really make sense for Oracle to try to break down anything beyond the function.
    Of course, you could always parse the expression and extract the column name, but I would be dubious that's the right answer... If a developer is comparing indexes between columns, there is a heck of a lot of difference between an index on BATCH_TYPE, and index on UPPER(BATCH_TYPE) and an index on SOME_OTHER_FUNCTION( BATCH_TYPE ).
    Justin

  • How to know column name (not an expression) used by function-based index?

    Hi guys,
    Is there any way to know exact column name used by FBI? If I correct, there is SYS.ICOLDEP$ table that has mapping between index/table columns, but I don't see how it could be uniquely joined with the rest. I know about USER_IND_EXPRESSIONS, but the task is to know exact column name, not it's expression.
    This required by our so-called SQL preprocessing of DB schema update utility, which parses stmt (INSERT in our case) and should check against PK/UNIQUE key values.
    Thanks!

    I don't think this is possible in 10g or 11g because :
    1. dictionary keeps track of column number in index and not in table
    2. the expression used in CREATE INDEX is a system generated column
    You would have to parse the expression from USER_IND_EXPRESSIONS:
    SQL> create table t(x int, y int);
    Table created.
    SQL> create index fbi on t(y+1);
    Index created.
    SQL> column index_name format a10
    SQL> column column_name format a20
    SQL> column column_expression format a10
    SQL> select i.index_name, ic.column_name, ic.column_position as iccn, ie.column_position as iecn, ie.column_expression
      2  from user_indexes i , user_ind_columns ic, user_ind_expressions ie
      3  where i.index_name = ic.index_name
      4  and i.index_name = ie.index_name
      5  and i.index_name =  'FBI';
    INDEX_NAME COLUMN_NAME                ICCN       IECN COLUMN_EXP
    FBI        SYS_NC00003$                  1          1 "Y"+1

  • Do I need to create indexes on column name?

    Following queries have been shown as bad sql :          
    select * from t1 where name = 'FUNCTION'
    Count=     7     Avg Time=13     Min Time=0     Max Time=47
    select * from t2 where name = 'USER_TYPE'      
    Count=2     Avg Time=85     Min Time=0     Max Time=156
    select * from t3 where name = 'TEMPLATE'
    Count=7     Avg Time=19     Min Time=0     Max Time=32
    All these tables have less than 20 records and static tables.                    
    Do I need to create indexes on column name?

    A FTS even on very small tables can require more latches than accessing via an index. Also, a table access requires the segment header and data block to be accessed (2) whereas an index on a small index only requires access to the index root block and table block (2).
    True, it's unlikely to make much of a difference in most environments but if the table is really heavily accessed, indexing even very small tables can help to reduce the related latch overheads.
    Most of these small tables have PKs and are accessed via the PK so associated indexes usually exist anyways.
    Cheers
    Richard Foote
    http://richardfoote.wordpress.com/

  • Function short dump - A dynamically specified column name is unknown.

    Hello,
    I've created BRF fuction according to the  Note 1466868 - Dunning by collection strategy with BRFplus. I get short dump during simulation of function with following exception:
    "A dynamically specified column name is unknown. "
    Runtime Errors         SAPSQL_INVALID_FIELDNAME
    Exception              CX_SY_DYNAMIC_OSQL_SEMANTICS
    No.   Ty.          Program                             Include                             Line
          Name
       19 METHOD       CL_FDT_ELEMENT================CP    CL_FDT_ELEMENT================CM012   129
          CL_FDT_ELEMENT=>GET_VALUES_DDIC
       18 METHOD       CL_FDT_ELEMENT================CP    CL_FDT_ELEMENT================CM011   124
          CL_FDT_ELEMENT=>GET_VALUES
       17 METHOD       CL_FDT_WD_RENDER_VALUE_INPUT==CP    CL_FDT_WD_RENDER_VALUE_INPUT==CM00G   139
          CL_FDT_WD_RENDER_VALUE_INPUT=>VALIDATE_VALUES
    In my opinion there is uncorrect query.
    Current version:
    .  SELECT FIKRS AS VALUE NAME AS TEXT FROM FMBS_BS_T
        INTO CORRESPONDING FIELDS OF TABLE lt_value
        WHERE LANGU EQ 'E'.
    instead of:
    .  SELECT FM_AREA AS VALUE NAME AS TEXT FROM FMBS_BS_T
        INTO CORRESPONDING FIELDS OF TABLE lt_value
        WHERE LANGU EQ 'E'.
    My sap version:
    EHP4 FOR SAP ERP 6.0 / NW7.01
      SAP_BASIS     701     0003     SAPKB70103
    Do you know any note or solution  to resolve this problem.
    Best regards,
    Jacek Witczak

    Hi, I came back to working on "Dunning by collection strategy with BRFplus". According to your sugestions, I raised the level of components:
    SAP_BASIS Level 09
    SAP_ABA level 09
    PI_BASIS level 09
    SAP_BW level 09
    But still I have the same short dump.
    Shoudl we raise any other components? Maybe you know note, which resolve this problem?

  • CREATE INDEX WITH DUPLICATE COLUMN NAME

    Hi,
    i need to interface our application with an Orale Bridge to CREATE INDEX with duplcate column Name.
    For Example
    CREATE index NLOT_FOURNLOT_idx ON NLOT(FOURNISSEUR ,NOLOT ,FOURNISSEUR ,NOBLFOUNISSEUR,NOLIGNEBL ,NOLOT ,QTECOLISRECUES ,CODENONQUALITE ,QTECOLISACCEPTE);
    CREATE table NLOT(
    FOURNISSEUR VARCHAR2(09)
    ,NOBLFOURNISSEUR VARCHAR2(13)
    ,NOLIGNEBL VARCHAR2(03)
    ,NOLOT VARCHAR2(20)
    ,QTECOLISRECUES VARCHAR2(10)
    ,CODENONQUALITE VARCHAR2(02)
    ,QTECOLISACCEPTE VARCHAR2(10)
    ,NOMBREDECOLISRE VARCHAR2(10)
    ,NOMBREDECOLISAC VARCHAR2(10)
    ,FILLER VARCHAR2(1)
    ,FILLE1 VARCHAR2(1)
    ,TYPEREFERENCE VARCHAR2(01)
    ,REFERENC1 VARCHAR2(15)
    ,CONTROLERECEPTI VARCHAR2(01)
    ,DATEDEPEREMPTIO VARCHAR2(8)
    ,CONTROLEPROCHAI VARCHAR2(1)
    Thanks
    Philippe

    Well, you can't do it. ORA-957 is one of those irrevocable errors for which the solution is to remove the duplicate name from the SQL statement.
    But, anyway, why do you want to do this? I would guess there's no performance benefit from having the same column indexed twice (of course it's impossible to test this, so it's just my opinion).
    Cheers, APC

  • Maximum length allowed for column name, index name and table name?

    Hi,
    I want to know what is the maximum length allowed for coulmn name, table name and index name in MaxDB ?
    Regards
    Raj

    Hi Raja,
    simply check the catalog:
    sqlcli bwt=> \dc domain.columns
    Table "DOMAIN.COLUMNS"
    | Column Name      | Type         | Length | Nullable | KEYPOS |
    | ---------------- | ------------ | ------ | -------- | ------ |
    | SCHEMANAME       | CHAR UNICODE | 32     | YES      |        |
    | OWNER            | CHAR UNICODE | 32     | YES      |        |
    | TABLENAME        | CHAR UNICODE | 32     | YES      |        |
    | COLUMNNAME       | CHAR UNICODE | 32     | YES      |        |
    and
    sqlcli bwt=> \dc domain.indexes
    Table "DOMAIN.INDEXES"
    | Column Name        | Type         | Length | Nullable | KEYPOS |
    | ------------------ | ------------ | ------ | -------- | ------ |
    | SCHEMANAME         | CHAR UNICODE | 32     | YES      |        |
    | OWNER              | CHAR UNICODE | 32     | YES      |        |
    | TABLENAME          | CHAR UNICODE | 32     | YES      |        |
    | INDEXNAME          | CHAR UNICODE | 32     | YES      |        |
    regards,
    Lars

  • How to pass column name at run time in function.

    how to pass column name at run time in function as parameter.
    thank in advance
    pramod patel

    Hello,
    Using dynamic sql you can pass column name to function. well I am not getting what you really want to do ? Please write in more detail. By the way I am providing one example here. see it uses dynamic sql.
    Create or replace function fun_updtest (p_columnname_varchar2 in varchar2,
    p_value_number in number)
    return number is
    v_stmt varchar2(500);
    begin
    v_stmt := 'update emp
    set '||p_columnname_varchar2||' = '||to_char(p_value_number)||'
              where empno = 7369';
    execute immediate v_stmt;
    return 0;
    commit;
    end;
    call to this function can be like this..
    declare
    v_number               number;
    begin
    v_number := fun_updtest('SAL',5000);
    end;
    Adinath Kamode

  • Passing parameters to table valued functions and using parameters as column name on select

    I am creating a function where I want to pass it parameters and then use those parameters in a select statement. When I do that it selects the variable name as a literal not a column. How do I switch that context.
    Query:
    ALTER FUNCTION [dbo].[ufn_Banner_Orion_Employee_Comparison_parser_v2]
    @BANNER_COLUMN AS VARCHAR(MAX),
    @ORION_COLUMN AS VARCHAR(MAX)
    RETURNS @Banner_Orion_Employee_Comparison TABLE 
    LAST_NAME nvarchar(max),
    EMPNO int,
    BannerColumnName nvarchar(max),
    BANNER nvarchar(max),
    ORION nvarchar(max)
    AS
    BEGIN
    INSERT INTO @Banner_Orion_Employee_Comparison
    (LAST_NAME, BANNER, ORION)
    SELECT
    a.LAST_NAME, @BANNER_COLUMN, @ORION_COLUMN
    FROM OPENQUERY(ORCLPROD_APDORACLE, 'select LAST_NAME, BANNER_RANK, BADGE, EMP_STATUS from XTRACT_VIEW') AS a
    inner join IWM_Stage.dbo.ViewPersonnel AS b
    on a.BADGE = b.badge
    WHERE a.EMP_STATUS = 'A'
    and a.BANNER_RANK <> b.[rank]
    RETURN;
    END;
    GO
    Output
    I execute this:
    select * from ufn_Banner_Orion_Employee_Comparison_parser_v2 ('a.BANNER_RANK' , 'b.[rank]')
    and get:
    Cerecerez NULL
    NULL a.BANNER_RANK
    b.[rank]
          

    George,
    You could go for using a CASE statement as earlier mentioned by Erland. This would look like below: (Downside is that you need to be mentioning all possible values in the CASE)
    ALTER FUNCTION [dbo].[ufn_Banner_Orion_Employee_Comparison_parser_v2]
    @BANNER_COLUMN AS VARCHAR(MAX),
    @ORION_COLUMN AS VARCHAR(MAX)
    RETURNS @Banner_Orion_Employee_Comparison TABLE
    LAST_NAME nvarchar(max),
    EMPNO int,
    BannerColumnName nvarchar(max),
    BANNER nvarchar(max),
    ORION nvarchar(max)
    AS
    BEGIN
    INSERT INTO @Banner_Orion_Employee_Comparison(LAST_NAME, BANNER, ORION)
    SELECT
    a.LAST_NAME
    , CASE @BANNER_COLUMN WHEN 'a.BANNER_RANK' THEN a.BANNER_RANK WHEN 'a.BADGE' THEN a.BADGE END --put values as required
    , CASE @ORION_COLUMN WHEN 'b.[rank]' THEN b.[rank] END --put values as required
    FROM OPENQUERY(ORCLPROD_APDORACLE, 'select LAST_NAME, BANNER_RANK, BADGE, EMP_STATUS from XTRACT_VIEW') AS a
    inner join IWM_Stage.dbo.ViewPersonnel AS b
    on a.BADGE = b.badge
    WHERE a.EMP_STATUS = 'A'
    and a.BANNER_RANK <> b.[rank]
    RETURN;
    END;
    GO
    Another method that I would suggest is to get all values from the function, then build a dynamic query to obtain results from it .. Something like:
    ALTER FUNCTION [dbo].[ufn_Banner_Orion_Employee_Comparison_parser_v2]()
    RETURNS @Banner_Orion_Employee_Comparison TABLE
    LAST_NAME nvarchar(max),
    EMPNO int,
    BannerColumnName nvarchar(max),
    BANNER nvarchar(max),
    ORION nvarchar(max)
    AS
    BEGIN
    INSERT INTO @Banner_Orion_Employee_Comparison(LAST_NAME, BANNER, ORION)
    SELECT
    * --Returns all the columns
    FROM OPENQUERY(ORCLPROD_APDORACLE, 'select LAST_NAME, BANNER_RANK, BADGE, EMP_STATUS from XTRACT_VIEW') AS a
    inner join IWM_Stage.dbo.ViewPersonnel AS b
    on a.BADGE = b.badge
    WHERE a.EMP_STATUS = 'A'
    and a.BANNER_RANK <> b.[rank]
    RETURN;
    END;
    GO
    --Execution
    DECLARE @BANNER_COLUMN AS VARCHAR(MAX), @ORION_COLUMN AS VARCHAR(MAX),@SQL NVARCHAR(MAX)
    SET @BANNER_COLUMN='BANNER_RANK'
    SET @ORION_COLUMN='[rank]'
    SET @SQL='
    select LAST_NAME,'+@BANNER_COLUMN+','+@ORION_COLUMN+' from ufn_Banner_Orion_Employee_Comparison_parser_v2 ()'
    PRINT @SQL
    EXEC @SQL
    You just need to make sure that the column names returned by the function are UNIQUE (Using proper alias names) so that you don't have a problem referring to them from the outside..
    Thanks,
    Jay
    <If the post was helpful mark as 'Helpful' and if the post answered your query, mark as 'Answered'>

Maybe you are looking for

  • Recursion using a linked list

    I am confused at how to make a linked list using recursion. I've been looking at the syntax and examples from the web for the past couple hours, but all seem to be based on an empty .java file. I need to put it in my code somehow. here's the code seg

  • OSB ftp reading same file multiple times in cluster

    We have 3 nodes osb cluster osb1,obs2, osb3 file based proxy is deployed to cluster with 'poll managed server' as osb1 and post read action as Archive We see same file is being read hundreds of times and archiving same hundreds of times Does anybody

  • Missing data after updating to 1.3.5.1

    I updated my Palm Pre webOS to 1.3.5.1 and lost ALL my calendar events.  My contacts no longer come up when I attempt to create a new text message.  I also cannot view contacts or pull them up by typing the contact name when I want to make a call.  A

  • Newly installed Photoshop Elements 12 doesn't open up on my computer.

    I can't get past the task menu bar.  how do I open up and use photoshop elements 12?  I've clicked on Organizer to start organizing media and that didn't work.  I clicked on Photo Editor to launch Photoshop Elements Editor and that didn't work.

  • Seeting Array index

    Can anyone tell me if it is possible to create an array, and set the index to start at an element other than 0? I want to start my inedx at 2 with 11 elements rather than starting at 0 with elements 0 - 10. Please help! Thanks.