C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SQLServer ですがわかりません。

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■95210 / inTopicNo.1)  SQLServer ですがわかりません。
  
□投稿者/ ファイター (8回)-(2020/07/02(Thu) 09:11:35)

分類:[.NET 全般] 

以下のように SQL を作ってみたのですが
思うように動作しません。

DECLARE @Table1 TABLE ( SName varchar(20) NOT NULL )
INSERT INTO @Table1 SELECT 'B'

DECLARE @Table2 TABLE ( SName varchar(20) NOT NULL )
INSERT INTO @Table2
SELECT 'A'
UNION SELECT 'B'
UNION SELECT 'C'
UNION SELECT 'D'

SELECT *
FROM @Table2 AS T2
WHERE EXISTS (
SELECT COUNT(*)
FROM (
SELECT SName
FROM @Table1
) AS t1
WHERE T1.SName = T2.Sname
)

共通しているのは B だけなので B だけ出力されると思ったのですが

結果は
A, B, C, D すべて出てきます。

最終的には以下のようにして使うつもりです。
どうすればよいのでしょうか?

DELETE @Table2
WHERE EXISTS ( 〜同上〜 )



引用返信 編集キー/
■95211 / inTopicNo.2)  Re[1]: SQLServer ですがわかりません。
□投稿者/ ファイター (9回)-(2020/07/02(Thu) 09:24:01)
すみません。以下のようにしたらできました。

COUNT(*) → *

次のステップに進もうとしたのですが、
また、うまくいきません。

DELETE @Table2 AS T2
WHERE EXISTS (
SELECT *
FROM @Table1 AS T1
WHERE T1.SName = T2.SName
)

[AS T2] が使えないようです。
以下のようにしてもだめでした。
どうすればよいのでしょうか?

DELETE @Table2
WHERE EXISTS (
SELECT *
FROM @Table1 AS T1
WHERE T1.SName = @Table2.SName
)


引用返信 編集キー/
■95212 / inTopicNo.3)  Re[2]: SQLServer ですがわかりません。
□投稿者/ 魔界の仮面弁士 (2766回)-(2020/07/02(Thu) 09:44:32)
No95211 (ファイター さん) に返信
> DELETE @Table2 AS T2

テーブル名や列名は変数にできません。
理由としては、事前に実行計画を立てられなくなるためだそうです。


どうしても動的に変動させたい場合は、アドホック クエリーとして SQL を組み立てて、
sp_executesql もしくは EXEC / EXECUTE ステートメントで呼び出すことができます。
ただし SQL インジェクションに注意。

https://docs.microsoft.com/ja-jp/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql
https://docs.microsoft.com/ja-jp/sql/relational-databases/security/sql-injection
引用返信 編集キー/
■95214 / inTopicNo.4)  Re[3]: SQLServer ですがわかりません。
□投稿者/ ファイター (10回)-(2020/07/02(Thu) 10:46:09)
No95212 (魔界の仮面弁士 さん) に返信

ありがとうございました。

いろいろ試したところ、理由はわかりませんが、
以下のように一時テーブルを使用するとできました。

DECLARE @Table1 TABLE ( SName varchar(20) NOT NULL )
INSERT INTO @Table1 SELECT 'B'

CREATE TABLE #Table2 (SName VARCHAR(10));
INSERT INTO #Table2
SELECT 'A'
UNION SELECT 'B'
UNION SELECT 'C'
UNION SELECT 'D'

DELETE #Table2
WHERE EXISTS (
SELECT *
FROM (
SELECT SName
FROM @Table1
) AS t1
WHERE T1.SName = #Table2.Sname
)

IF OBJECT_ID(N'tempdb..#Table2', N'U') IS NOT NULL DROP TABLE #Table2;


解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ