5

同じ列の2つのビューがあります。最初のビューの列の1つは「オンザフライ」で生成され、として設定されNULL、他のビューの同じ列には値が。として保存されvarcharます。次のようなストアドプロシージャがあります。

ALTER PROCEDURE [dbo].[mi_GetLearners]  
(@centrename nvarchar(200))  
AS  

SELECT [centrename]  
      ,[Name]  
      ,[Username] --generated on the fly as NULL
FROM  [DB1].[dbo].[vw_Learners]  
WHERE [centrename] = @centrename  

UNION  

SELECT [centrename]  
      ,[Name]   
      ,[Username] --values stored as varchar   
FROM  [Linked_Server].[DB2].[dbo].[vw_Learners]  
WHERE [centrename] = @centrename 

DB1はSQLServer2008上にありますR2DB2はSQLServer2005上にあり
ます

ストアドプロシージャを実行すると、次のエラーが発生します。

メッセージ245、レベル16、状態1、1行目varchar値'someusername'をデータ型intに変換するときに変換に失敗しました。

他の列がとして設定されているのに、なぜ値をintデータ型に変換しようとしているのNULLですか?代わりに、2番目の列をからストアドプロシージャに変更すると、正常にNULL機能します... selectステートメントで生成された列と列' 'の結合がこのようなエラーをスローする理由については本当に困惑しています...何かアイデアはありますか?varcharNULL

編集:私は解決策ではなく説明を探しています...

編集2:次のコードを実行します:

CREATE VIEW vw_myview
AS
SELECT NULL AS MyColumn

EXECUTE sp_help vw_myview

戻り値:

    Type    Column_name
     int       MyColumn
4

3 に答える 3

7

問題は、NULL(いくつかの小刻みに動く部屋の中で)すべてのデータ型のメンバーであるということです。

クエリを実行するときSELECTは、各列の内容は1つのタイプである必要があり、1つのタイプのみである必要があります。列(sを含む)に値が混在している場合NULLは、非値のタイプを調べることでタイプを明確に判別でき、NULL必要に応じて適切な変換が実行されます。

ただし、すべての行にNULL特定の列が含まれてNULLいて、が特定のタイプにキャストされていない場合、使用するタイプ情報はありません。したがって、SQL Serverは、やや恣意的に、この列のタイプがであると判断しますint

create view V1
as
    select 'abc' as Col1,null as Col2
go
create view V2
as
    select 'abc' as Col1,CAST(null as varchar(100)) as Col2

V1varchar(3)タイプとの列がありますint

V2varchar(3)タイプとの列がありますvarchar(100)

于 2012-07-11T12:03:55.317 に答える
4

フィールドのタイプは、ユニオンの最初のSELECTによって決定されると思います。2つの選択の順序を変更するか、CAST(NULL AS VARCHAR(...))に変更してみてください。

于 2012-07-11T11:35:27.023 に答える
1

同じデータ型にキャストする必要があると思います。

---
AS  

SELECT [centrename]  
      ,[Name]  
      ,CAST(NULL AS VARCHAR(MAX)) AS [Username] 
FROM  [DB1].[dbo].[vw_Learners]  
WHERE [centrename] = @centrename  

UNION  
---
于 2012-07-11T11:33:27.420 に答える