2008-09-26 18 views
5

Wie bekomme ich den relativen Pfad in t sql? Nehmen wir zum Beispiel an, dass sich eine .sql-Datei im Ordner D: \ temp befindet. Ich möchte den Pfad der Datei hello.txt im Ordner D: \ temp \ App_Data abrufen. Wie verwende ich die relative Pfadreferenz?Relativer Pfad in t sql?

Angenommen, ich führe die SQL-Datei im SQL Server Management Studio aus.

+0

Möchten Sie dies in einer gespeicherten Prozedur tun? –

+0

Ja, ich möchte es in einer gespeicherten Prozedur tun – Graviton

+0

Ich glaube nicht, dass der Inhalt einer .SQL-Datei irgendwelche Kenntnisse über die Datei haben, in der sie enthalten waren, dh sie wissen nicht, wo sie sind, also sie kann einen "relativen" Pfad nicht bestimmen oder konstruieren. –

Antwort

3

Der Server führt die T-SQL aus. Es weiß nicht, woher der Client die Datei geladen hat. Sie müssen den Pfad in das Skript eingebettet haben.

DECLARE @RelDir varchar(1000) 
SET @RelDir = 'D:\temp\' 
... 

Vielleicht können Sie programmatisch den Weg in den SET-Befehl innerhalb der SQL-Skriptdatei, oder vielleicht können Sie mit sqlcmd und übergeben die relative Verzeichnis in als Variable.

6

Die .SQL-Datei ist nur ... eine Datei. Es hat keinen Sinn für seinen eigenen Standort. Es ist die Sache, die es ausgibt (die Sie nicht angegeben haben), die einen Sinn für seinen Standort, den Speicherort der Datei haben würde.

Ich bemerke, dass Sie einen App_Data-Ordner erwähnt haben, also denke ich, dass ASP.NET beteiligt ist. Wenn Sie relative Pfade in Ihre Webanwendung verwenden möchten, sehen MapPath

http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.mappath.aspx

3

Wenn T-SQL ausgeführt wird, wird es auf dem Server in einem Batch ausgeführt wird, nicht auf dem Client-Computer ausgeführt Management Studio (oder jeden anderen SQL-Client). Der Client sendet nur den Textinhalt der .sql-Datei an den Server, der ausgeführt werden soll. Wenn sich diese Datei also nicht auf dem Datenbankserver befindet, bezweifle ich sehr, dass Sie mit einem SQL-Skript darauf zugreifen können.

1

Das t-SQL-Skript wird zuerst von QueryAnalyzer, SSMS oder sqlcmd auf der Clientseite vorverarbeitet. Diese Programme sind sich der Datei-Lokalisierung bewusst und können relative Pfade ähnlich wie Oeacle sqlplus leicht handhaben.

Offensichtlich ist dies nur eine Design-Entscheidung von Microsoft und ich wage eine ziemlich dumme zu sagen.

0

Nun, es ist nicht ein Microsoft-Ding zuerst ... es ist ein Industriestandard. zweiten Ihre Lösung T-SQL mit einem relativen Pfad für den Betrieb ist einen Batch-Skript oder etwas zu verwenden, die Pfadangabe IE zu injizieren:

@echo OFF 
SETLOCAL DisableDelayedExpansion 
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t-SQL.SQL"`) do (
    set "var=%%a" 
    SETLOCAL EnableDelayedExpansion 
    set "var=!var:*:=!" 
    set RunLocation=%~dp0 
    echo(%~dp0!var! > newsql.sql 
    ENDLOCAL 
) 
sqlcmd newsql.sql 

oder so etwas ohnehin

+0

danke für die Reinigung dieser Lanze ... :) –

4

ich ein ähnliches Problem hatte, und löste es mit sqlcmd Variablen in Verbindung mit der% CD% Pseudovariable. Nahm ein bisschen Versuch und Irrtum, um alle Teile zu kombinieren. Aber schließlich hat alles funktioniert. In diesem Beispiel wird davon ausgegangen, dass sich die Datei script.sql im selben Verzeichnis befindet wie die Datei runscript.bat.

runscript.bat

sqlcmd -S .\SQLINSTANCE -v FullScriptDir="%CD%" -i script.sql -b 

script.sql

BULK INSERT [dbo].[ValuesFromCSV] 
FROM '$(FullScriptDir)\values.csv' 
with 
(
    fieldterminator = ',', 
    rowterminator = '\n' 
) 
go 
0

habe ich versucht, Methode von Bemerkungen des mateuscb. Ich fand es kann nicht funktionieren, ich weiß nicht warum, dann habe ich nach mehreren Tests geschafft. Es kann unten mit dem Skript arbeiten:

runscript.bat

@set FullScriptDir=%CD% 
sqlcmd -S .\SQLINSTANCE -i script.sql 

script.sql

BULK INSERT [dbo].[ValuesFromCSV] 
FROM '$(FullScriptDir)\values.csv' 
with 
(
    fieldterminator = ',', 
    rowterminator = '\n' 
) 
go 

Nur zur Information für die weitere Diskussion.