マルチ パート 識別子 を バインド できません で した。 sql

意味

マルチ パート 識別子 を バインド できません で した

私はSOで同様のエラーを見ましたが、私は私の問題に対する解決策を見つけることができません。 次のようなSQLクエリがあります。 SELECT DISTINCT a. maxa , b. mahuyen , a. tenxa , b. tenhuyen , ISNULL dkcd. maxa WHERE a. maxa '99' AND LEFT a. mahuyen ORDER BY maxa; このクエリを実行すると、エラーの結果は次のようになります。 マルチパート識別子 "a. maxa"をバインドできませんでした。 SELECT DISTINCT a. maxa , b. mahuyen , a. tenxa , b. tenhuyen FROM phuongxa a , quanhuyen b WHERE a. maxa '99' AND LEFT a. それは許可されていますが、それを正しく行う方法を知っておく必要があります。 つまり、明示的結合( JOINキーワードを使用して実装されている結合)は、暗黙的結合( WHERE節で結合条件が指定されている「コンマ」結合)よりも優先されます。 クエリの概要は次のとおりです。 SELECT … FROM a, b LEFT JOIN dkcd ON … WHERE … あなたはおそらくそれがこのように振る舞うと期待している: SELECT … FROM a, b LEFT JOIN dkcd ON … WHERE … つまり、テーブル aと bの組み合わせは、テーブル dkcdと結合されます。 実際、何が起こっているのですか SELECT … FROM a, b LEFT JOIN dkcd ON … WHERE … つまり、すでにご存知のとおり、 dkcdは bに対してのみ結合され、 bのみが結合され、結合の結果は aと結合され、さらに WHERE節でフィルタリングされます。 この場合、 a節での ONへの参照は無効です。 その時点では aは不明です。 あなたがエラーメッセージを受け取っているのはそのためです。 私があなたであれば、私はおそらくこのクエリを書き直すことを試みるでしょう、そして1つの可能な解決策はかもしれません: SELECT DISTINCT a. maxa, b. mahuyen, a. tenxa, b. tenhuyen, ISNULL dkcd. tong, 0 AS tongdkcd FROM phuongxa a INNER JOIN quanhuyen b ON LEFT a. maxa WHERE a. maxa '99' ORDER BY a. maxa ここではテーブル aと bが最初に結合され、次に結果が dkcdに結合されます。 基本的に、これはあなたのものと同じ問い合わせで、結合の1つに異なる構文を使用するだけで、大きな違いがあります: dkcdの結合条件における参照 a. maxaは絶対に有効です。 Aaron Bertrandが正しく指摘しているように、あなたはおそらく maxaを ORDER BY節で特定のエイリアス、おそらく aで修飾するべきです。 あなたがエイリアス名を与えた場合、それを実際の名前に変更してください 例えば SELECT A. name,A. date FROM [LoginInfo]. [dbo]. [TableA] as A join [LoginInfo]. [dbo]. [TableA] as B on [LoginInfo]. [dbo]. [TableA]. [dbo]. [TableB]. name; それをに変える SELECT A. name,A. date FROM [LoginInfo]. [dbo]. [TableA] as A join [LoginInfo]. [dbo]. [TableA] as B on A. name; 私はまた、このエラーに苦しんでいたし、答えと同じ戦略になってしまいました。 これがうまくいくはずの戦略であることを確認するためだけに、私は自分の答えを含めています。 これは、最初にデータを取得した2つのテーブル間で1つの内部結合を実行し、次に空になる可能性のある対応する行を持つ可能性のあるテーブルで2つの左外部結合を実行する例です。 テーブル間でデフォルトのカンマ区切りの構文を使用して目的の結合で行を削除するのではなく、内部結合と外部結合を混在させて結果をテーブル全体のデータで取得します。 use somedatabase go select o. operationid, o. operatingdate, p. pasid, p. name as patientname, o. operationalunitid, f. name as operasjonsprogram, o. theaterid as stueid, t. name as stuenavn, o. status as operasjonsstatus from operation o inner join patient p on o. operationid left outer join freshorganizationalunit f on f. operationalunitid left outer join theater t on t. theaterid where p.

次の

意味

マルチ パート 識別子 を バインド できません で した

説明 Explanation SQL Server SQL Server でのエンティティの名前は、そのエンティティの " 識別子" と呼ばれます。 The name of an entity in SQL Server SQL Server is referred to as its identifier. 識別子は、クエリ内で列やテーブルの名前を指定する場合など、エンティティを参照するときは必ず使用します。 You use identifiers whenever you reference entities, for example, by specifying column and table names in a query. マルチパート識別子には、1 つ以上の修飾子が識別子のプレフィックスとして含まれます。 A multi-part identifier contains one or more qualifiers as a prefix for the identifier. たとえば、テーブル識別子は、そのテーブルが含まれるデータベースの名前やスキーマの名前などの修飾子をプレフィックスとして持つことができます。 また列識別子は、テーブル名やテーブル別名などの修飾子をプレフィックスとして持つことができます。 For example, a table identifier may be prefixed with qualifiers such as the database name and schema name in which the table is contained, or a column identifier may be prefixed with qualifiers such as a table name or table alias. エラー 4104 は、指定されたマルチパート識別子を既存のエンティティにマップできなかったことを示します。 Error 4104 indicates that the specified multi-part identifier could not be mapped to an existing entity. このエラーは、次のような状況で返される可能性があります。 This error can be returned under the following conditions:• 列名のプレフィックスとして指定された修飾子と、クエリで使用されているテーブル名または別名が一致しない。 The qualifier supplied as a prefix for a column name does not correspond to any table or alias name used in the query. たとえば、次のステートメントでは、テーブル別名 Dept を列プレフィックスとして使用していますが、このテーブル別名は FROM 句で参照されていません。 For example, the following statement uses a table alias Dept as a column prefix, but the table alias is not referenced in the FROM clause. SELECT Dept. Name FROM HumanResources. Department; 次のステートメントでは、WHERE 句で 2 つのテーブル間の JOIN 条件の一部としてマルチパート列識別子 TableB. KeyCol を指定していますが、 TableB はクエリで明示的に参照されていません。 In the following statements, a multi-part column identifier TableB. KeyCol is specified in the WHERE clause as part of a JOIN condition between two tables, however, TableB is not explicitly referenced in the query. DELETE FROM TableA WHERE TableA. KeyCol; SELECT 'X' FROM TableA WHERE TableB. KeyCol;• FROM 句でテーブルの別名を指定しているが、列のプレフィックスとして指定しているのはテーブル名である。 An alias name for the table is supplied in the FROM clause, but the qualifier supplied for a column is the table name. たとえば、次のステートメントでは、FROM 句でテーブルの別名 Department を参照しているにもかかわらず、テーブル名 Dept を列プレフィックスとして使用しています。 For example, the following statement uses the table name Department as the column prefix; however, the table has an alias Dept referenced in the FROM clause. SELECT Department. Name FROM HumanResources. Department AS Dept; 別名を使用する場合、テーブル名をステートメントの他の部分で使用することはできません。 When an alias is used, the table name cannot be used elsewhere in the statement. SQL Server SQL Server では、マルチパート識別子がテーブルをプレフィックスとする列を参照しているか、または列をプレフィックスとする CLR ユーザー定義データ型 UDT のプロパティを参照しているかを判断できない。 is unable to determine if the multi-part identifier refers to a column prefixed by a table or to a property of a CLR user-defined data type UDT prefixed by a column. このような状況が発生するのは、UDT 列のプロパティを参照するとき、列名にテーブル名をプレフィックスとして加える場合と同じように、列名とプロパティ名の間に区切り文字としてピリオド. を使用するためです。 This happens because properties of UDT columns are referenced by using the period separator. between the column name and the property name in the same way that a column name is prefixed with a table name. 次の例では、 a と b という 2 つのテーブルを作成します。 The following example creates two tables, a and b. テーブル b は列 a を含み、この列は CLR UDT の dbo. myudt2 をデータ型として使用します。 Table b contains column a, which uses a CLR UDT dbo. myudt2 as its data type. SELECT ステートメントはマルチパート識別子 a. c2 を含みます。 The SELECT statement contains a multi-part identifier a. CREATE TABLE a c2 int ; GO CREATE TABLE b a dbo. myudt2 ; GO SELECT a. c2 FROM a, b; UDT myudt2 が c2 という名前のプロパティを持たないと仮定すると、 SQL Server SQL Server は、識別子 a. c2 がテーブル a の列 c2 を参照するのか、テーブル b の列 a のプロパティ c2 を参照するのかを判断できません。 Assuming that the UDT myudt2 does not have a property named c2, SQL Server SQL Server cannot determine whether identifier a. c2refers to column c2 in table a or to the column a, property c2 in table b. ユーザーの操作 User Action• 列プレフィックスとクエリの FROM 句で指定したテーブル名または別名を一致させます。 Match the column prefixes against the table names or alias names specified in the FROM clause of the query. FROM 句でテーブルの別名を定義した場合、テーブルに関連する列の修飾子として使用できるのはその別名だけです。 If an alias is defined for a table name in the FROM clause, you can only use the alias as a qualifier for columns associated with that table. HumanResources. Department テーブルを参照する上記のステートメントは、次のように修正できます。 The statements above that reference the HumanResources. Department table can be corrected as follows: SELECT Dept. Name FROM HumanResources. Department AS Dept; GO SELECT Department. Name FROM HumanResources. Department; GO• すべてのテーブルがクエリで指定されていること、およびテーブル間の JOIN 条件が正しく指定されていることを確認します。 Ensure that all tables are specified in the query and that the JOIN conditions between tables are specified correctly. 上記の DELETE ステートメントは次のように修正できます。 The DELETE statement above can be corrected as follows: DELETE FROM dbo. TableA WHERE TableA. KeyCol FROM TableB WHERE TableA. KeyCol ; GO TableA に対する上記の SELECT ステートメントは次のように修正できます。 The SELECT statement above for TableA can be corrected as follows: SELECT 'X' FROM TableA, TableB WHERE TableB. KeyCol; or or SELECT 'X' FROM TableA INNER JOIN TableB ON TableB. KeyCol;• 明確に定義された一意の名前を識別子に使用します。 Use unique, clearly defined names for identifiers. こうすることにより、コードの読みやすさと管理性が向上し、複数のエンティティをあいまいに参照する危険性も最小限に抑えられます。 Doing so makes your code easier to read and maintain, and it also minimizes the risk of ambiguous references to multiple entities. 参照 See Also 関連記事.

次の

sql — マルチパート識別子をバインドできませんでした

マルチ パート 識別子 を バインド できません で した

SQLserverのテーブル値関数の使い方 SQLserver2012でテーブル値関数を作成しています。 その際、実際の値ではなく、テーブルの列名を渡し、外部結合をしたいのですが、 上手くいきません。 列名が指定できないのでしょうか。 教えてください。 が 以下の様にテーブルの列名を指定し外部結合すると上手くいきません。 select B. flg B on A. flg B on A. メッセージ 4104、レベル 16、状態 1、行 4 マルチパート識別子 "A. となります。 どうすればよいか教えてください。 お願いします。 投稿日時 - 2015-09-29 08:23:50 回答No. 1 です。 失敬、要件を見誤っていました。 この目的なら一時テーブルか一時ファンクションを使うのが王道だと思いますが、静的ファンクションに拘るのであれば、以下の SQL でできるかもしれません 未検証です。 select B. flg B on A. 一時テーブルも検討されたほうが良いかと思います。 投稿日時 - 2015-10-01 00:36:58 ありがとうございます。 もう少し教えてください。 実際にやりたいことは、カンマ区切りのデータを行展開にしたいのです。 以下の様にしましたがエラーがでます。 となります。 メッセージ 207、レベル 16、状態 1、プロシージャ Split、行 26 列名 'stpos' が無効です。 メッセージ 207、レベル 16、状態 1、プロシージャ Split、行 26 列名 'endpos' が無効です。 メッセージ 207、レベル 16、状態 1、プロシージャ Split、行 26 列名 'endpos' が無効です。 メッセージ 207、レベル 16、状態 1、プロシージャ Split、行 26 列名 'endpos' が無効です。 メッセージ 207、レベル 16、状態 1、プロシージャ Split、行 26 列名 'endpos' が無効です。 メッセージ 207、レベル 16、状態 1、プロシージャ Split、行 26 列名 'stpos' が無効です。 どのようにすれが正しく動きますか。 お願いします。 投稿日時 - 2015-09-30 08:45:42.

次の