2016-08-03 3 views
-1

Я запускаю SQL-задание (SQL Server 20208 R2), и я хочу, чтобы результаты сценария сохранялись в папке с ограничением на канал. Есть ли способ сделать это, добавив в скрипт? Ниже приведен сценарий. Если нет, я могу сделать это по-другому?SQL Job to Pipe Delimited

SELECT Distinct 
    (SELECT REPLACE(CONVERT(VARCHAR(10),PatientDemographics.DateofBirth,101),'/','')) as DOB 
    , (SELECT REPLACE(CONVERT(VARCHAR(10),ScheduleEntry.ScheduleDate,101),'/','')) as DateofService 
    , RTRIM(LTRIM(Insurances.EligibilityPayorNumber)) as InsurancePayorCode 
    , RTRIM(LTRIM(ContractFacilityProviders.NPI)) as ProviderID 
    , RTRIM(LTRIM(PatientInsuranceProfiles.Insurance1PolicyNumber)) as SubscriberInsuranceID 
    , RTRIM(LTRIM(PatientInsuranceProfiles.Insurance1PolicyGroupNumber)) as SubscriberGroupNumber 
    , RTRIM(LTRIM(PatientDemographics.firstname)) as SubscriberFirstName 
    , RTRIM(LTRIM(PatientDemographics.MiddleInitial)) as SubscriberMiddleInitial 
    , RTRIM(LTRIM(PatientDemographics.Lastname)) as SubscriberLastName 
FROM 
    ScheduleEntry 
LEFT JOIN 
    PatientDemographics ON ScheduleEntry.PatientAccount = PatientDemographics.AccountNumber 
LEFT JOIN 
    Providers ON ScheduleEntry.ResourceCode = Providers.MedStarProviderIdentifier 
LEFT JOIN 
    Facilities ON ScheduleEntry.FacilityCode = Facilities.MedStarFacilityIdentifier 
LEFT JOIN 
    AddedResource ON ScheduleEntry.ResourceCode = AddedResource.AddedResourceCode 
LEFT JOIN 
    Caregiver ON ScheduleEntry.ResourceCode = Caregiver.CaregiverCode 
LEFT JOIN 
    PatientInsuranceProfiles ON ScheduleEntry.PatientAccount = PatientInsuranceProfiles.PatientAccountNumber 
LEFT JOIN 
    Insurances ON PatientInsuranceProfiles.Insurance1Mnemonic = Insurances.Mnemonic 
LEFT JOIN 
    ContractFacilityProviders ON PatientDemographics.PrimaryPhysician = ContractFacilityProviders.ProviderIdentifier 
WHERE 
    ScheduleEntry.ScheduleDate >= getdate() 
    AND ScheduleEntry.ScheduleDate <= getDate() + .50 
    AND PatientInsuranceProfiles.Insurance1ContractIdentifier = ContractFacilityProviders.ContractIdentifier 
    AND PatientinsuranceProfiles.ActiveFlag = 1 
    AND EligibilityPayorNumber > 1 
    AND ContractFacilityProviders.NPI > 1 
ORDER BY 
    SubscriberLastName 
+2

Примечание: Ваш запрос не делать то, что вы думаете, что он делает. Включая правые таблицы 'LEFT JOIN' в разделе' WHERE', вы эффективно трансформируете свою 'LEFT JOIN' в' INNER JOIN'. – Siyual

+0

@siyaul Это дает мне результаты, которые я хочу, но –

+0

Вы что-то изучили? Попробовал Google решение? Кроме того, люди могут не захотеть дать ответ, потому что по вашей истории вы не отмечаете ответы как принятые ответы. – dfundako

ответ

0

Несколько идей

1) Написать пакет SSIS для экспорта в плоский файл, используя трубу в качестве разделителя. 2) Используйте BCP, как указано уже 3) Используйте sqlcmd для вывода результата

SSIS будет хорошим решением для задания SQL.

Я также хотел бы повторить предыдущие плакаты, которые предложил проверить, что ваш не отрицая эффекты левой присоединяется с помощью таблицы в пункте, где

0

Вы можете xp_cmdshell с чем-то вроде ....

SELECT DISTINCT 
--your columns 
INTO ##PIPE_FILE 
FROM YourTables 
INNER JOIN YourOtherTables 


EXECUTE master.dbo.xp_cmdshell 
'bcp "SELECT * FROM ##PIPE_FILE " queryout C:\Folder\Pipes.txt -t"|" -c -T ' 
+0

Можно ли это сделать как sql-работу? –

+0

Да как скрипт TSQL в задании агента – scsimon

0

EDIT: Если у вас нет доступ к xp_cmdshell (многие АБД превратить этот офф)

Ниже будет принимать результаты #TempPipe и динамически сохранить его в виде трубы с разделителями (с заголовком - по желанию) до нужного л ocation.

Теперь вам понадобится хранимая процедура, перечисленная ниже, вместе с соответствующей записью.

-- Assumes your query will be saved to #TempPipe 
Select * Into #TempPipe from OD 

-- Set Destination File 
Declare @Destination varchar(250) = 'C:\Working\Test_Pipe.txt' 

-- Construct Field Name and Header from #TempPipe 
Declare @Header varchar(max) = '>>>' 
Select @Header = @Header +']|['+Name from (select * from tempdb.sys.columns where object_id = object_id('tempdb..#TempPipe')) A Order by column_id 
Select @Header = Replace(@Header,'>>>]|','')+']' 

Declare @SelectHead varchar(max) = 'Select Pipe=cast(Replace(Replace('''[email protected]+''',''['',''''),'']'','''') as varchar(max)) ' 
Declare @SelectData varchar(max) = 'Select Pipe=cast(concat('+Replace(@Header,'|',',''|'',')+') as varchar(max)) from #TempPipe ' 
--If Version<2012 Declare @SelectData varchar(max) = 'Select Pipe=cast(cast('+Replace(@Header,'|',' as varchar(500))+''|''+cast(')+' as varchar(500)) as varchar(max)) from #TempPipe ' 

Declare @SQL varchar(max) =' 
Declare @String varchar(max) = ''''; 
Select @String = @String + Pipe + char(13)+char(10) From ('[email protected]+' Union All '[email protected]+') A 

Exec [dbo].[prc-Write-To-File] @String, ''' + @Destination +''' 
' 
--Select @SQL 
Exec(@SQL) 

Хранимая процедура, чтобы написать любую строку в любой файл

EXEC sp_configure 'show advanced options', 1 
GO 
EXEC sp_configure 'Ole Automation Procedures', 1; 
GO 
RECONFIGURE; 
GO 

CREATE Procedure [dbo].[prc-Write-To-File] (@text as Varchar(Max), @Filename Varchar(200)) AS 
Begin 
    Declare @Object int,@rc int,@FileID Int 

    EXEC @rc = sp_OACreate 'Scripting.FileSystemObject', @Object OUT 
    EXEC @rc = sp_OAMethod @Object , 'OpenTextFile' , @FileID OUT , @Filename , 2 , 1 
    Set @text = Replace(Replace(Replace(@text,'&','&'),'<' ,'<'),'>','>') 
    EXEC @rc = sp_OAMethod @FileID , 'WriteLine' , Null , @text 
    Exec @rc = [YourDatabaseName].dbo.sp_OADestroy @FileID 
    Declare @Append bit 
    Select @Append = 0 
    If @rc <> 0 
    Begin 
     Exec @rc = [YourDatabaseName].dbo.sp_OAMethod @Object, 'SaveFile',null,@text ,@Filename,@Append 
    End 
    Exec @rc = [YourDatabaseName].dbo.sp_OADestroy @Object 
End 

Небольшой образец текстового файла, генерируемого

ODNr|ODID|ODClass|ODTitle|ODLMUsr|ODLMUTC|ODDeleted 
0|UNDEF|UNDEF|Undefined|2|Apr 5 2016 1:40PM|0 
1|SYSTEM|UNDEF|System|2|Apr 5 2016 1:40PM|0 
2|UNDEF|USER|Cappelletti, John|2|Apr 12 2016 7:04PM|0 
3|UNDEF|UNDEF|Daily Production Summary|2|Apr 14 2016 12:28PM|0