srv_paraminfo
Returns information about a parameter.Important  This function supersedes the following Open Data Services functions: srv_paramtype, srv_paramlen, srv_parammaxlen, and srv_paramdata. srv_paraminfo supports the new Data Types and zero-length data.
Syntax
int srv_paraminfo (
SRV_PROC * srvproc, 
int n,
BYTE * pbType,
ULONG * pcbMaxLen,
ULONG * pcbActualLen,
BYTE * pbData,
BOOL * pfNull );

解决方案 »

  1.   

    例如:sp_executesql 
    看了幫助後就可調用  declare @str varchar(4000)
     select @str='select * from TEst ' exec sp_executesql @str
    當然也可以加多個
      

  2.   

    比如这个,怎么办啊?也是帮助里面的,谢谢int srv_paraminfo (
    SRV_PROC * srvproc, 
    int n,
    BYTE * pbType,
    ULONG * pcbMaxLen,
    ULONG * pcbActualLen,
    BYTE * pbData,
    BOOL * pfNull );
      

  3.   


    谢谢楼上,但sp_sproc_columns 对扩展过程无效啊,返回空的啊
      

  4.   


    sql server 有现成的例子的:xp_param在安装CD\DEVTOOLS\SAMPLES\ODS目录下:
    我把代码贴出来:
    /***********************************************************************
    Copyright (c) 2000, Microsoft Corporation
    All Rights Reserved.
    ***********************************************************************/
    // This is an example of an extended procedure DLL built with Open Data
    // Services. The function within the DLL can be invoked by using the
    // extended stored procedures support in SQL Server.
    //
    // For more information on Open Data Services refer to the Microsoft Open 
    // Data Services Programmer's Reference.
    //
    // xp_srv_paraminfo_sample accepts parameters from a Transact-SQL statement.
    // It analyzes each parameter then posts a result set to the client
    // containing information about each parameter and the parameter's value.
    //
    // The Transact-SQL script xp_param.sql installs and exercises the extended
    // stored procedure.
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include <windows.h>
    #include <srv.h>
    #include <time.h>// Macros -- return codes
    #define XP_NOERROR      0
    #define XP_ERROR        1#define MAX_SERVER_ERROR 20000
    #define XP_PARAM_ERROR MAX_SERVER_ERROR+1void printError (SRV_PROC *pSrvProc, CHAR* szErrorMsg);
    void printUsage (SRV_PROC *pSrvProc);// It is highly recommended that all Microsoft?SQL Server (7.0 
    // and greater) extended stored procedure DLLs implement and export 
    // __GetXpVersion. For more information see SQL Server 
    // Books Online
    ULONG __GetXpVersion(){
        return ODS_VERSION;
    }
    SRVRETCODE xp_srv_paraminfo_sample
        (
        SRV_PROC* pSrvProc
        )
        {
        char        acHeader[24];
        BYTE        bType;
        long        cbMaxLen;
        long        cbActualLen;
        PBYTE*      ppbData;
        BOOL        fNull;
        int         nParams;
        int         nParam;
        SRVRETCODE  rc = XP_NOERROR;#ifdef _DEBUG
        // In a debug build, look up the data type name for assistance.
        DBCHAR*     pdbcDataType;
        int         cbDataType;
    #endif    // Count up the number of input parameters
        nParams = srv_rpcparams(pSrvProc);
        if (nParams == -1)
            {
            printUsage (pSrvProc);
            return (XP_ERROR);
            }
        
        // Build an array of data pointers for the input parameters.
        ppbData = (PBYTE*) malloc(nParams * sizeof(PBYTE));
        if (ppbData == NULL)
            {
            printError (pSrvProc, "Memory allocation error.");
            return (XP_ERROR);
            }
        memset(ppbData, (int) NULL, nParams * sizeof(PBYTE));    for (nParam = 0; nParam < nParams; nParam++)
            {
            // Use srv_paraminfo to get data type and length information. Ask
            // for the data later using a non-null ppbData argument in a second
            // srv_paraminfo call.
            if (srv_paraminfo(pSrvProc, nParam+1, &bType, &cbMaxLen, &cbActualLen,
                NULL, &fNull) == FAIL)
                {
                rc = XP_ERROR;
                break;
                }

            // Describe the paramter. The column header indicates whether
            // the parameter is input or output.
            sprintf(acHeader, "Parameter %d: %s", nParam+1,
            ((srv_paramstatus(pSrvProc, nParam+1) & SRV_PARAMRETURN) ?
                "Output" : "Input"));
            srv_describe(pSrvProc, nParam+1, acHeader, SRV_NULLTERM, bType,
                cbActualLen, bType, cbActualLen, NULL);        // If there's data, then dynamically allocate memory and retrieve it.
            if (fNull == 0)
                {
                ppbData[nParam] = malloc(cbActualLen);
                if (ppbData[nParam] == NULL)
                    {
                    rc = XP_ERROR;
                    break;
                    }

                if (srv_paraminfo(pSrvProc, nParam+1, &bType, &cbMaxLen,
                    &cbActualLen, ppbData[nParam], &fNull) == FAIL)
                    {
                    rc = XP_ERROR;
                    break;
                    }
                }#ifdef _DEBUG
            // A debugging aid. Get the name of the data type of the parameter.
            pdbcDataType = srv_symbol(SRV_DATATYPE, (int) bType, &cbDataType);
    #endif        // Set the column's data;
            if (srv_setcoldata(pSrvProc, nParam+1, ppbData[nParam]) == FAIL)
                {
                rc = XP_ERROR;
                break;
                }
            }    // Send the row to the client.
        if (rc == XP_NOERROR)
            {
            if (srv_sendrow(pSrvProc) == FAIL)
                {
                rc = XP_ERROR;
                }
            }    // Free dynamically allocated memory.
        for (nParam = 0; nParam < nParams; nParam++)
            {
            if (ppbData[nParam])
                {
                free(ppbData[nParam]);
                }
            }    free(ppbData);    // Indicate that we're done.
        if (rc == XP_NOERROR)
            {
            srv_senddone(pSrvProc, (SRV_DONE_COUNT | SRV_DONE_MORE), 0, 1);
            }
        else if (rc == XP_ERROR)
            {
            printError (pSrvProc, "XP encountered an error.");
            }    return (rc);
        }// send szErrorMsg to client
    void printError (SRV_PROC *pSrvProc, CHAR* szErrorMsg)
        {
        srv_sendmsg(pSrvProc, SRV_MSG_ERROR, XP_ERROR, SRV_INFO, 1,
                NULL, 0, (DBUSMALLINT) __LINE__, 
                szErrorMsg,
                SRV_NULLTERM);    srv_senddone(pSrvProc, (SRV_DONE_ERROR | SRV_DONE_MORE), 0, 0);
        }// send XP usage info to client
    void printUsage (SRV_PROC *pSrvProc)
        {
        // usage: exec xp_srv_paraminfo_sample [@param1, [@param2 output],...]    srv_sendmsg(pSrvProc, SRV_MSG_ERROR, XP_PARAM_ERROR, SRV_INFO, 1,
                NULL, 0, (DBUSMALLINT) __LINE__, 
                "usage: exec xp_srv_paraminfo_sample [@param1, [@param2 output],...]",
                SRV_NULLTERM);
        srv_senddone(pSrvProc, (SRV_DONE_ERROR | SRV_DONE_MORE), 0, 0);    }