OLE DBプロバイダ'sqloledb'がカラムに提供するメタデータが一致しません.実行時に名前が変更されました.
6735 ワード
OLE DBプロバイダ'sqloledb'がカラムに提供するメタデータが一致しません.実行時に名前が変更されました.
OLE DBプロバイダ'sqloledb'がオブジェクトに列がないことを示すエラーの解決方法
ネット上で1人のネットユーザーの質問がシステムの過程の結果をテキストのファイルに出力することを見て、これは簡単ではないと思って、bcp+openrowsetは気楽に解決して、まじめな態度に基づいて(実は間違いを書いて人に笑わせるのを恐れています)私は私のクエリーの分析器の中で1つの試みを書きます:
F 5が動いたら、終わって、恥をかいた.
このいつも書いている文法はどうして間違っているのか,自分で過程を書いてみて,やってみるともっとぼんやりしている.
結果は考えて、それではどうしてこのシステムの過程はだめですか?まずこの過程を見てみましょう
見てみると、ああ、この結果は入力パラメータが異なるため、異なるselectが影響を返しているのではないでしょうか.または、空の場合raiserrorにselect結果セットがありませんか?やりやすいから、もう一度やってみましょう.
以上のテストを通じて、结果は明らかになりました.つまり、検索文はプロセスの可能な结果集を分析しました.特に最初のプロセスに参加しても参加しない结果が明らかになりました.インターネットでggを利用して、闻く人は本当に少なくありません.多くの人は2005の改善を期待していますが、2000は本当にだめですか.sql 2000のオンラインヘルプを調べることによって、この設定項目を発見して、とても役に立ちます、ははは
明らかに、このスイッチ項目は私たちが望んでいるアナライザが実行すべき結果です.試してみましょう.
sql 2005では確かに改善が行われており、以下の2つの書き方で結果が得られます.
変換元:http://blog.csdn.net/happyflystone/article/details/4551247
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