3

したがって、イメージテーブルを製品テーブルに接続するために内部結合が必要な場合にこの問題が発生します。以下に示すように、テーブルへの接続を使用して各列名を指定しようとしました。私のWHEREステートメントに関しては、それが難しいところです。他のコードビハインドの目的で、ProductIDをpidという変数として保存する必要があるためです。

SELECT * FROM ProductTBL p
INNER JOIN ImageTBL img on p.ProductID = img.ProductID 
WHERE (ProductID = @pid)

このコードを実行すると、ProductIDがあいまいな列名であることがわかり、Whereステートメントをさらに次のように指定しようとすると次のようになります。

WHERE (p.ProductID = @pid)

データが取り出された特定の行にデータがバインドされていないことを示す別のエラーが表示されます。このエラーは、上記のようなWhereステートメントを指定しない場合にのみ発生します。

どんな入力でも大歓迎です:)

PS:何か言いたいことがあれば、MSSQLを実行しています。

4

4 に答える 4

1

「あいまいな列名」メッセージはSQLServerエラーであり、「WHERE p.ProductID=@pid」を指定して修正しました。はい、pが必要です。ImageTBLにも同じ名前の列があるため、ProductIDの前にあります。

「データがバインドされていません」というエラーはSQLから発生していません。これで正しいSQLステートメントが作成されましたが、少なくともそれを実行している@pidの値については、レコードが返されていないようです。

データを使って何かをしようとしているアプリケーションからこれを呼んでいますよね?ここから「データがバインドされていません」というエラーが発生します。

SQL Server Management StudioのクエリウィンドウでSQLステートメントを実行し、@ pidに目的の値をプラグインすることで、問題の2つの部分を分離できます。次に、アプリケーションをデバッグモードで実行し、ManagementStudioに表示されるのと同じデータをアプリケーションが受信しているかどうかを確認できます。これが1つの推測です。アプリケーションが@pidを正しく渡しておらず、SQLステートメントがp.ProductID=''のレコードを返しています。それが起こっているかどうかを確認してください。

于 2013-03-27T12:33:26.793 に答える
1

私はこれを行う2つの方法を知っています。2番目の方法がおそらく推奨される方法です(より速く実行する必要があります)。

方法1)

2ステップのステートメントで実行します。内部のSELECTステートメントで*を使用できるとは思いません。

SELECT * FROM (
    SELECT p.ProductID, [other needed fields]
    FROM ProductTBL p
    INNER JOIN ImageTBL img on p.ProductID = img.ProductID
    ) as x
WHERE (ProductID = @pid)

内部のSELECTp.ProductIDは、ProductTBLからProductIDを明示的に返すように指示します。そのProductIDフィールドは、外部SQLステートメントにあるため、WHEREステートメントで使用できます。

方法2)

参加の一部として「WHERE」基準を設定します

SELECT *
FROM ProductTBL p
INNER JOIN ImageTBL img on p.ProductID = img.ProductID AND p.ProductID = @pid
于 2013-05-10T15:38:23.773 に答える
0

コードに問題がある可能性があります。製品IDのハードコア値を使用してクエリを実行し、データベースコンソールで実行してみてください。

データベースの問題ではないようです

于 2013-03-27T12:16:13.887 に答える
0

さて、問題のある場所のステートメントです。productIDの前にテーブルエイリアスを付ける必要があります。テーブルエイリアスは良いです。SELECT*FromMyTableTと入力し、戻って列を選択すると、*をTに置き換えると、列のインテリジェントリストが表示されることに気付いたことは間違いありません。常に良いです。2つのテーブルT1とT2があり、列C1、C2、C3がT1にあり、C4、C5、C6がT2にあるとします。ストアドプロシージャをスクリプト化すると、機能します。しばらくして、誰かがやって来て、C2という名前のc列をT2に追加します。列にテーブル名を付けないと、プロシージャが壊れてしまう可能性があります。したがって、現在のあいまいさがなく、ストアドプロシージャを変更しない場合でも、プレフィックスを使用する方が常に堅牢です。

*を使用するのではなく、列を明示的に指定することをお勧めします。これは、列を追加するとprocが破損する可能性があり、列名が正しくない場合、SSMSは小さな赤い波線で下線を引くためです。

于 2013-03-27T12:46:34.903 に答える