OLE DBプロバイダ'sqloledb'がカラムに提供するメタデータが一致しません.実行時に名前が変更されました.

6735 ワード

OLE DBプロバイダ'sqloledb'がカラムに提供するメタデータが一致しません.実行時に名前が変更されました.
OLE DBプロバイダ'sqloledb'がオブジェクトに列がないことを示すエラーの解決方法
 
ネット上で1人のネットユーザーの質問がシステムの過程の結果をテキストのファイルに出力することを見て、これは簡単ではないと思って、bcp+openrowsetは気楽に解決して、まじめな態度に基づいて(実は間違いを書いて人に笑わせるのを恐れています)私は私のクエリーの分析器の中で1つの試みを書きます:
--1
select *  from OPENROWSET('SQLOLEDB','SERVER=.;UID=sa;PWD=','exec csdn_test.dbo.sp_helpsrvrolemember') AS a 


--2
SELECT * FROM  openrowset('sqloledb','Trusted_Connection=yes','exec csdn_test..sp_helpsrvrolemember ')

F 5が動いたら、終わって、恥をかいた.
   :    7357,   16,   2,  1

       'exec csdn_test.dbo.sp_helpsrvrolemember'。OLE DB      'SQLOLEDB'            。

OLE DB     [Non-interface error:  OLE DB provider unable to process object, since the object has no columnsProviderName='SQLOLEDB', Query=exec csdn_test.dbo.sp_helpsrvrolemember']。

このいつも書いている文法はどうして間違っているのか,自分で過程を書いてみて,やってみるともっとぼんやりしている.
create proc pr_test

as

begin

    select * from tb
end

go

SELECT   *   FROM   openrowset('sqloledb',   'Trusted_Connection=yes','exec csdn_test..pr_test')

drop proc pr_test

/*

TypeID      Type 

----------- ---- 

1           t1

2           t2

3           t3

4           t4

 

(        4  )

*/

結果は考えて、それではどうしてこのシステムの過程はだめですか?まずこの過程を見てみましょう
sp_helptext 'master..sp_helpsrvrolemember'
/*

Text                                                                                                                                                                                                                                                            

------------------------------------------ 

CREATE PROCEDURE sp_helpsrvrolemember

    @srvrolename       sysname = NULL

AS

    if @srvrolename is not null

    begin

        -- VALIDATE GIVEN NAME

        if not exists (select * from master.dbo.spt_values

              where name = @srvrolename and low = 0 and type = 'SRV')

        begin

           raiserror(15412, -1, -1, @srvrolename)

           return (1)

        end

 

        -- RESULT SET FOR SINGLE SERVER-ROLE

        select 'ServerRole' = spv.name, 'MemberName' = lgn.name, 'MemberSID' = lgn.sid

           from master.dbo.spt_values spv, master.dbo.sysxlogins lgn

           where spv.name = @srvrolename and

                spv.low = 0 and

                spv.type = 'SRV' and

                lgn.srvid IS NULL and

                spv.number & lgn.xstatus = spv.number

    end

    else

    begin

        -- RESULT SET FOR ALL SERVER-ROLES

        select 'ServerRole' = spv.name, 'MemberName' = lgn.name, 'MemberSID' = lgn.sid

           from master.dbo.spt_values spv, master.dbo.sysxlogins lgn

           where spv.low = 0 and

                spv.type = 'SRV' and

                lgn.srvid IS NULL and

                spv.number & lgn.xstatus = spv.number

    end
    return (0) -- sp_helpsrvrolemember
*/

見てみると、ああ、この結果は入力パラメータが異なるため、異なるselectが影響を返しているのではないでしょうか.または、空の場合raiserrorにselect結果セットがありませんか?やりやすいから、もう一度やってみましょう.
create proc pr_test

@p int =null

as

begin

    if @p is  null

        select * from tb

    else 

        return 0

    return 1
end

go

create proc pr_test1

@p int =null

as

begin

    if @p is not null

        return 0

    else 

        select * from tb

    return 1
end

go

create proc pr_test2

@p int =null

as

begin

    if @p is not null

        return 0

    else 

        select * from tb

    return 1
end

go


SELECT   *   FROM   openrowset('sqloledb',   'Trusted_Connection=yes','exec csdn_test..pr_test')

SELECT   *   FROM   openrowset('sqloledb',   'Trusted_Connection=yes','exec csdn_test..pr_test 1')

SELECT   *   FROM   openrowset('sqloledb',   'Trusted_Connection=yes','exec csdn_test..pr_test1')

SELECT   *   FROM   openrowset('sqloledb',   'Trusted_Connection=yes','exec csdn_test..pr_test2')


drop proc pr_test,pr_test1,pr_test2

以上のテストを通じて、结果は明らかになりました.つまり、検索文はプロセスの可能な结果集を分析しました.特に最初のプロセスに参加しても参加しない结果が明らかになりました.インターネットでggを利用して、闻く人は本当に少なくありません.多くの人は2005の改善を期待していますが、2000は本当にだめですか.sql 2000のオンラインヘルプを調べることによって、この設定項目を発見して、とても役に立ちます、ははは
SET FMTONLY
           。

  
SET FMTONLY { ON | OFF }

  
  SET FMTONLY   ON  ,        ,                 。

SET FMTONLY              ,         。

明らかに、このスイッチ項目は私たちが望んでいるアナライザが実行すべき結果です.試してみましょう.
select *  from     OPENROWSET('SQLOLEDB','DRIVER={SQL Server};SERVER=.;UID=sa;PWD=','set fmtonly off;exec csdn_test.dbo.sp_helpsrvrolemember') AS a 

select *  from     OPENROWSET('SQLOLEDB','SERVER=.;UID=sa;PWD=','set fmtonly off;exec csdn_test.dbo.sp_helpsrvrolemember') AS a 


exec master..xp_cmdshell 

'bcp "select * from OPENROWSET(''SQLOLEDB'',''SERVER=.;UID=sa;PWD='',''set fmtonly off;exec csdn_test.dbo.sp_helpsrvrolemember'') AS a " queryout c:/Authors.txt -c -S. -Usa -P'


/*

ServerRole                          MemberName                                                                            MemberSID 

----------------------------------- ------------------- ------ 

sysadmin BUILTIN/Administrators 0x01020000000000052000000020020000

sysadmin sa                         0x01

 

(        2  )

 

ServerRole             MemberName             MemberSID

--------------------- ----------- --------------------------- 

sysadmin BUILTIN/Administrators 0x01020000000000052000000020020000

sysadmin sa                         0x01

 

(        2  )

 

output                                                                                                                                                                                                                                                          

-------------------

NULL

    ...

NULL

     2  。

      (  ): 4096

    (  ):       10

NULL

(        7  )
*/

sql 2005では確かに改善が行われており、以下の2つの書き方で結果が得られます.
select *  from     openrowset('SQLNCLI','Server=./sql2005;Trusted_Connection=yes','exec testcsdn..sp_helpsrvrolemember')as a

select *  from     OPENROWSET('SQLOLEDB','DRIVER={SQL Server};SERVER=./sql2005;UID=sa;PWD=flystone','exec testcsdn.dbo.sp_helpsrvrolemember') AS a

 
変換元:http://blog.csdn.net/happyflystone/article/details/4551247