Deklarieren Sie die Tabellenvariable in einem UDF, um den Tabellennamen als Parameter einzugeben

Ich arbeite an einer Abfrage und schuf eine function, um Ergebnis aus der outcomes Tabelle zu erhalten, die den folgenden Code aushängt.

 CREATE FUNCTION dbo.Shippad (@tbl NVARCHAR(30)) RETURNS TABLE AS RETURN SELECT LEFT(ship, Charindex(' ', ship) - 1) + ' ' + Replicate('*', Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) + 1 -2) + ' ' + Reverse(LEFT(Reverse(ship), Charindex(' ', Reverse(ship)) - 1)) as final_work FROM outcomes WHERE Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) > 1 

Das Problem des obigen Codes ist, dass es egal ist, welchen Parameter ich während der Ausführung eingegeben habe, es gibt immer das Ergebnis, solange der eingegebene Parameter ein gültiger Tabellenname in der database ist.

Im Moment frage ich mich, ob ich einen Parameter erstellen könnte, um einen Tabellennamen in FROM Teil einzugeben, auf diese Weise nur, wenn ich outcomes , würde es das Ergebnis anzeigen.

Ich habe versucht, eine Tabellenvariable mit dem folgenden Code zu deklarieren:

 declare @ship_outcome table ( final_work nvarchar(30) ) insert into @ship_outcome (final_work) select left(ship, charindex(' ', ship) - 1) + ' ' + replicate('*', charindex(' ', substring(ship, charindex(' ', ship) + 1, len(ship))) + 1 -2) + ' ' + reverse(left(reverse(ship), charindex(' ', reverse(ship)) - 1)) from outcomes where charindex(' ', substring(ship, charindex(' ', ship) + 1, len(ship))) > 1; select * from @ship_outcome 

Allerdings bin ich mir nicht sicher, wie man die Tabellenvariable in die UDF konsolidiert. Bitte helfen Sie.

Sie können das Ergebnis auch mit der IF-statement in der Multi-statementstabelle bewerteten function wie folgt erreichen: –

 CREATE FUNCTION dbo.Shippad (@tbl NVARCHAR(30)) RETURNS @t table (final_work nvarchar(30)) AS begin if @tbl = 'outcomes' begin Insert into @t SELECT LEFT(ship, Charindex(' ', ship) - 1) + ' ' + Replicate('*', Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) + 1 -2) + ' ' + Reverse(LEFT(Reverse(ship), Charindex(' ', Reverse(ship)) - 1)) as final_work FROM outcomes WHERE Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) > 1 end return end 

Hinweis – Die performance der Multi-statementstabelle Wertfunktion ist für große datasätze schrecklich. Es empfiehlt sich, die Inline-function zu verwenden, indem @tbl = 'outcomes' verwendet wird, wobei die Klausel in der Inline-Tabellenwertfunktion wie –

 CREATE FUNCTION dbo.Shippad (@tbl NVARCHAR(30)) RETURNS TABLE AS RETURN SELECT LEFT(ship, Charindex(' ', ship) - 1) + ' ' + Replicate('*', Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) + 1 -2) + ' ' + Reverse(LEFT(Reverse(ship), Charindex(' ', Reverse(ship)) - 1)) as final_work FROM outcomes WHERE Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) > 1 and @tbl = 'outcomes'