DECLARE @.FileName varchar(50),
@.bcpCommand varchar(8000);
With temporary(name,Decile)
as
(
select name, NTILE(10) over (order by sales DESC) as 'Decile' from table1 where date=199205
)
update table1
SET @.FileName = REPLACE('D:\Test\9205'+'.txt','/','-')
SET @.bcpCommand = 'bcp "select name from temporary where decile=1" queryout "'
SET @.bcpCommand = @.bcpCommand + @.FileName + '" -U -P -c'
EXEC master..xp_cmdshell @.bcpCommand
the error i get is :Error = [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'temporary'.
If i use Declare after the CTE has been defined i get :
Incorrect syntax near the keyword 'DECLARE'.
Any suggestion. Thanks in advance.
CTE is only visible within a batch in a connection. When you execute BCP using xp_cmdshell, you are actually invoking an external process (bcp in this case) which makes a new connection to SQLServer. So it will not have any context about the declared CTE. Also, the way you are using the CTE doesn't make sense also. You declare a CTE but then you update the base table directly. Even though it is legal I am not sure what you are doing. CTE is also not a peristent object like view or table-valued function.
You could do one of the following:
1. Query from the base table directly
2. Specify CTE definition in the queryout parameter itself
3. Dump the results of the table into a global temporary table and export from there (this will prevent the BCP from being executed simultaneously by different connections though)
没有评论:
发表评论