2017-01-13 8 views
0

文字列を連結してプロシージャに渡したいのですが...最初の例ではハードコード化されていますが、動的ファイル名を渡す必要がありますこのハードコードは正常に動作します動作するように以下の障害の1 ...変数を使用してストアドプロシージャにパラメータを渡すことはできません

を取得するには:

exec master.dbo.sp_getfiledetails_CC 'c:\temp\test file.xml' 
    , @filedate = @FileDateTime OUTPUT 

これはしません:

DECLARE @CCTMP as varchar(max) 
set @cctmp = 'master.dbo.sp_getfiledetails_CC ''c:\temp\text file.xml'' 
    , @filedate = @FileDateTime OUTPUT' 
exec @cctmp 

これはどちらかない:

DECLARE @CCTMP as varchar(max) 
DECLARE @FileName as varchar(max) 
set @filename = 'c:\temp\text file.xml' 
set @cctmp = 'master.dbo.sp_getfiledetails_CC ' + @filename +' 
    , @filedate = @FileDateTime OUTPUT' 
exec @cctmp 

そして、どちらもこの行います

DECLARE @FileName as varchar(max) 
set @filename = 'c:\temp\text file.xml' 
exec master.dbo.sp_getfiledetails_CC ' + @filename +' 
    , @filedate = @FileDateTime OUTPUT' 

これが手順です:。

[DBO] [sp_getfiledetails_CC]

(
     @filename NVARCHAR(255) = NULL --(full path) 
     ,@filedate DATETIME OUTPUT 
    ) 

AS 
DECLARE @fileobj INT , @fsobj INT 
DECLARE @exists INT, @error INT 
DECLARE @src VARCHAR(255), @desc VARCHAR(255) 


--create FileSystem Object 
EXEC @error = sp_OACreate 'Scripting.FileSystemObject', @fsobj OUT 
IF @error <> 0 
BEGIN 
EXEC sp_OAGetErrorInfo @fsobj, @src OUT, @desc OUT 
SELECT error=CONVERT(varbinary(4),@error), [email protected], [email protected] 
RETURN 2 
END 

--check if specified file exists 
EXEC @error = sp_OAMethod @fsobj, 'FileExists', @exists OUT, @filename 

IF @exists = 0 
BEGIN 
--RAISERROR 22004 'The system cannot find the file specified.' 
RETURN 2 
END 

--Create file object that points to specified file 
EXEC @error = sp_OAMethod @fsobj, 'GetFile' , @fileobj OUTPUT, @filename 
IF @error <> 0 
BEGIN 
EXEC sp_OAGetErrorInfo @fsobj 
RETURN 2 
END 

--Declare variables holding properties of file 
DECLARE @Attributes TINYINT, 
@DateCreated DATETIME, 
@DateLastAccessed DATETIME, 
@DateLastModified DATETIME, 
@Drive VARCHAR(1), 
@Name NVARCHAR(255), 
@ParentFolder NVARCHAR(255), 
@Path NVARCHAR(255), 
@ShortPath NVARCHAR(255), 
@Size INT, 
@Type NVARCHAR(255) 

--Get properties of fileobject 
EXEC sp_OAGetProperty @fileobj, 'Attributes', @Attributes OUT 
EXEC sp_OAGetProperty @fileobj, 'DateCreated', @DateCreated OUT 
EXEC sp_OAGetProperty @fileobj, 'DateLastAccessed', @DateLastAccessed OUT 
EXEC sp_OAGetProperty @fileobj, 'DateLastModified', @DateLastModified OUT 
EXEC sp_OAGetProperty @fileobj, 'Drive', @Drive OUT 
EXEC sp_OAGetProperty @fileobj, 'Name', @Name OUT 
EXEC sp_OAGetProperty @fileobj, 'ParentFolder', @ParentFolder OUT 
EXEC sp_OAGetProperty @fileobj, 'Path', @Path OUT 
EXEC sp_OAGetProperty @fileobj, 'ShortPath', @ShortPath OUT 
EXEC sp_OAGetProperty @fileobj, 'Size', @Size OUT 
EXEC sp_OAGetProperty @fileobj, 'Type', @Type OUT 

--destroy File Object 
EXEC @error = sp_OADestroy @fileobj 
IF @error <> 0 
BEGIN 
EXEC sp_OAGetErrorInfo @fileobj 
RETURN 
END 

--destroy FileSystem Object 
EXEC @error = sp_OADestroy @fsobj 
IF @error <> 0 
BEGIN 
EXEC sp_OAGetErrorInfo @fsobj 
RETURN 2 
END 


--return results 
SELECT NULL AS [Alternate Name], 
@Size AS [Size], 
CONVERT(varchar, @DateCreated, 112) AS [Creation Date], 
REPLACE(CONVERT(varchar, @DateCreated, 108), ':', '') AS [Creation Time], 
CONVERT(varchar, @DateLastModified, 112) AS [Last Written Date], 
REPLACE(CONVERT(varchar, @DateLastModified, 108), ':', '') AS [Last Written Time], 
CONVERT(varchar, @DateLastAccessed, 112) AS [Last Accessed Date], 
REPLACE(CONVERT(varchar, @DateLastAccessed, 108), ':', '') AS [Last Accessed Time], 
@Attributes AS [Attributes] 

--SET @filedate = REPLACE(CONVERT(varchar, @DateLastModified, 108), ':', '') 
set @filedate = convert(datetime, CONVERT(float,@DateLastModified)) 
+0

sp_executesqlを試しましたか? https://msdn.microsoft.com/en-us/library/ms188001.aspx –

+0

通常、何かが動作しないと言っているのではなく、エラーメッセージや何が間違っているのかなどの説明が含まれています。 –

+0

@James Zこの手順では何も返されません –

答えて

0

は、私はこれがあなたの質問に答えると思います。

引数を渡すときにこれは動作しません:

DECLARE @CCTMP as varchar(max) 
set @cctmp = 'master.dbo.sp_who 1' 
exec @cctmp 

しかし、あなたは(でvarableをラップする場合、それは動作します):

DECLARE @CCTMP as varchar(max) 
set @cctmp = 'master.dbo.sp_who 1' 
exec (@cctmp) 

だからあなたの例では、このようなものになります。

declare @CCTMP as varchar(max) 

set @cctmp = 'declare @FileDateTime datetime 
exec master.dbo.sp_getfiledetails_CC ''c:\temp\text file.xml'' 
    , @filedate = @FileDateTime OUTPUT 
select @FileDateTime' 

-- create table to handle output of query 
declare @output table (output varchar(max)) 
insert @output exec (@cctmp) 

-- then you can pull your variable from @output 
select * from @output 
+0

これは不運です。私の最初のものがリストされています(ハードコードされています)。 –

0

なぜ動的SQLを使用しているのかわかりません。あなたが必要としない混乱の層を追加するだけです。

あなたがしようとしているのは、パラメータのポイントです。これはこれほど単純なものになります。

DECLARE @FileName as varchar(max) 
set @filename = 'c:\temp\text file.xml' 

declare @FileDateTime datetime 

exec master.dbo.sp_getfiledetails_CC @filename, @FileDateTime OUTPUT 

FWIWでは、マスターにプロシージャを作成する理由がわかりません。いずれにしても、sp_接頭辞はシステム手続きのためにMSによって予約されており、自分自身を追加することは危険です。そのプレフィックスを避けるべき理由については、こちらをご覧ください。 http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix

+0

こんにちは、私は成功していないことを上記#4と同じです。情報をありがとう:命名規則 - 私はすぐにそれを変更します。 –

+0

これはあなたが上に投稿したのと同じものではありません。あなたの#4はそこに奇妙な文字列を持っています。それが動作しない場合は、プロシージャコードとかなりの情報を共有する必要があります。 –

+0

私はそれを試しました - 運がない。上記の手順を追加しました。それは良いはずです、私はここでそれを見つけました。 –

関連する問題