2016-10-14 2 views
0

Ist so etwas wie diese möglich ?:eine variable Zeichenfolge in einer select Mit * von Aussage

DECLARE @test nvarchar(30) = 'Appt' 

SELECT * FROM @test.dbo.tablename with (NOLOCK) 

oder möglicherweise

DECLARE @test nvarchar(30) = 'Appt' 

SELECT * FROM @test + '.dbo.tablename' with (NOLOCK)  

Nein, nicht wahr?

Ich bin nicht auf der Suche nach der ganzen Zeichenfolge in eine Variable und verwenden Sie dann "EXEC". Ich habe lange Skripte, die ich nur versuchen möchte, um das zu ersetzen, wenn es auftritt.

Vielen Dank.

+3

nicht. nicht möglich. Sie müssen eine Zeichenfolge erstellen und dann ausführen. –

+0

Ok, das habe ich mir gedacht. War nur hoffnungsvoll :( –

+0

Aber was ist das Problem? Sie können eine Funktion 'DoQuery (@test)' erstellen und kapseln den 'EXEC' Anruf –

Antwort

1

Dies erfordert Dynamic SQL. Im Grunde erstellen Sie eine Zeichenfolge, die die SQL-Anweisung basierend auf Ihrer Abfrage dynamisch erstellt. Dieser String wird dann mit einer EXEC-Anweisung ausgeführt. Ein einfaches Beispiel ist wie folgt:

DECLARE @test nvarchar(30) = 'Appt' 
DECLARE @sql as varchar(max) 
SET @SQL = 'SELECT * FROM' + @test + '.dbo.tablename' + 'with (NOLOCK)' 
EXEC @SQL 

Angenommen, Ihre Tabellenname Appt.dbo.tablename

war ich glaube, Sie gemeint:

SET @SQL = 'SELECT * FROM' + 'dbo.' + @test + ' with (NOLOCK)' 
+0

Nun, das Problem ist, dass ich viele viele Insert-Anweisungen und Select-Anweisungen habe. also kann ich sie nicht alle in eine Variable setzen. –

+0

Sie können Ihr Herz weg schreiben. Sie verwenden einfach SELECT-Anweisungen und Verkettungen, um die gesamte Anweisung und Exec am Ende zu erstellen. Vergiss den Umfang nicht. Es ist schwieriger, eine Variable innerhalb des dynamischen SQL zu erstellen. Beachten Sie auch, wenn Sie eine Anweisung ausführen: 'SELECT * FROM ABCD'' INSERT INTO dbo.Something' ... Das wird zusammen ausgeführt, auch wenn keine Leerzeichen vorhanden sind. – logixologist

+1

Die Anweisungen in Ihrer Frage sind offen für SQL Injection Attacks. Verwenden Sie immer [QUOTENAME] (https://msdn.microsoft.com/nl-be/library/ms176114.aspx) für Tabellennamen, wenn Sie dynamisches SQL erstellen, um solche Angriffe zu vermeiden. Wie 'SET @ SQL = 'SELECT * FROM' + 'dbo.' + QUOTENAME (@test) + 'mit (NOLOCK)' '. Außerdem: 'EXEC (@SQL);' (cf https://msdn.microsoft.com/en-us/library/ms188332.aspx) –

1

Nizza Erklärung logixologist.

Da Tom es für mehrere SELECT-Anweisungen ausführen möchte, dachte ich, er könnte alle Tabellennamen in einer Spalte speichern und einen Cursor verwenden, um die Tabellenwerte abzurufen. Erwägen Sie eine Tabelle zunächst wie schaffen würde:

CREATE TABLE tableName (name varchar(20)); 

führen Sie dann den folgenden Code ein, wenn Sie die richtigen Werte in der obigen Tabelle eingefügt.

Declare @table VARCHAR(255) 
DECLARE @sql as varchar(max) 
SET @SQL = 'SELECT * FROM' + 'dbo.' + @table + ' with (NOLOCK)' 

DECLARE table_cursor CURSOR FOR 
select distinct([name]) FROM DBname.dbo.tableName 
Where [name] is not null 

OPEN table_cursor 
FETCH Next from table_cursor 
INTO @table 
WHILE @@FETCH_STATUS =0 
BEGIN 

EXEC @SQL 

FETCH NEXT FROM table_cursor 
INTO @table 
END 
CLOSE table_cursor 
DEALLOCATE table_cursor 

Der Cursor würde den Tabellennamen für die Select-Anweisung zurückgeben. Ich denke, Sie könnten dieselbe Logik für Insert-Anweisungen verwenden.

+0

Die meisten DBAs würden Sodbrennen bekommen, wenn Sie sogar einen Cursor zum Erstellen von Dynamic SQL verwenden würden. Es könnte funktionieren, aber es ist weniger wartbar, wenn Sie auf ein Problem stoßen. Schwieriger herauszufinden, wo das Problem liegt. – logixologist

Verwandte Themen