【发布时间】:2014-03-11 01:53:23
【问题描述】:
我想从 SQL Server (v 2012) 创建 vCard,然后我想通过电子邮件从 db_mail 发送它。要创建 vCard 文件,我使用的是 xp_cmdshell。我在一个 varchar 变量中准备所有 cmd 命令,并使用该变量作为命令文本执行 xp_cmdshell。结果并不如我所料。我只收到生成的 vCard 文件中文本的第一行。当我采用相同的文本并将其作为批处理文件运行时,vCard 文件已正确创建。
DECLARE @iIDUser AS INT = 1;
DECLARE @iIDContact AS INT = 1;
DECLARE @iResult AS INT;
DECLARE @sExecute_vCardText AS VARCHAR(8000) = '';
DECLARE @crlf CHAR(2) = CHAR(13) + CHAR(10);
DECLARE @sFile VARCHAR(1000) = ' >> C:\Databases\_tmp_sql\PES_ERP\User.vcf';
SELECT @sExecute_vCardText = @sExecute_vCardText
+ @crlf + 'ECHO ' + 'BEGIN:VCARD' + ' > C:\Databases\_tmp_sql\PES_ERP\User.vcf'
+ @crlf + 'ECHO ' + 'VERSION:2.1' + @sFile
+ @crlf + 'ECHO ' + 'CATEGORIES:' +
+ ISNULL(Cnt.ContactRole_Name_en,'')
+ ',' + ISNULL(Cnt.ContactRelationshipType_Name_en,'')
+ ',' + ISNULL(Cnt.VisibilityType_Name_en,'') + @sFile
+ @crlf + 'ECHO ' + 'FN:' + ISNULL(Cnt.ContactTitle_Name_en,'') + @sFile
+ ' ' + ISNULL(Cnt.Name,'') + ' ' + ISNULL(Cnt.Surname,'')
+ @crlf + 'ECHO ' + 'N:' + ISNULL(Cnt.Surname,'') + @sFile
+ ';' + ISNULL(Cnt.Name,'')
+ ';' + ISNULL(Cnt.ContactTitle_Name_en,'') + @sFile
+ @crlf + 'ECHO ' + 'TITLE:' + ISNULL(Cnt.JobTitle,'') + @sFile
+ @crlf + 'ECHO ' + 'BDAY:' + ISNULL(CONVERT(varchar(16),Cnt.BirthDate,112),'') + @sFile
+ @crlf + 'ECHO ' + 'BIRTH:' + ISNULL(Cnt.BirthMunicipality_Name,'') + @sFile
+ @crlf + 'ECHO ' + 'TEL;TYPE=work:' + ISNULL(Cnt.Business_Phone,'') + @sFile
+ @crlf + 'ECHO ' + 'TEL;TYPE=work:' + ISNULL(Cnt.Business_Phone2,'') + @sFile
+ @crlf + 'ECHO ' + 'TEL;TYPE=work,cell:' + ISNULL(Cnt.Business_Mobile,'') + @sFile
+ @crlf + 'ECHO ' + 'TEL;TYPE=work,cell:' + ISNULL(Cnt.Business_Mobile2,'') + @sFile
+ @crlf + 'ECHO ' + 'TEL;TYPE=work,fax:' + ISNULL(Cnt.Business_FAX,'') + @sFile
+ @crlf + 'ECHO ' + 'ADR;TYPE=work:;;' + ISNULL(Cnt.Business_Address,'') + ';' + ISNULL(Cnt.Business_City,'') + ';' + ISNULL(Cnt.Business_Municipality_Name,'') + ' (' + ISNULL(Cnt.Business_Region_Name,'') + ') ' + ';' + ISNULL(Cnt.Business_CAP,'') + ';' + ISNULL(CASE WHEN (@iIDLanguage = 40001) THEN Cnt.Business_Country_Name_en WHEN (@iIDLanguage = 40002) THEN Cnt.Business_Country_Name_it WHEN (@iIDLanguage = 40003) THEN Cnt.Business_Country_Name_de WHEN (@iIDLanguage = 40004) THEN Cnt.Business_Country_Name_fr ELSE Cnt.Business_Country_Name_en END,'') + @sFile
+ @crlf + 'ECHO ' + 'EMAIL;TYPE=internet,work,pref:' + ISNULL(Cnt.Business_EMail,'') + @sFile
+ @crlf + 'ECHO ' + 'EMAIL;TYPE=internet,work:' + ISNULL(Cnt.Business_EMail2,'') + @sFile
+ @crlf + 'ECHO ' + 'TEL;TYPE=home:' + ISNULL(Cnt.Home_Phone,'') + @sFile
+ @crlf + 'ECHO ' + 'TEL;TYPE=home,cell:' + ISNULL(Cnt.Home_Mobile,'') + @sFile
+ @crlf + 'ECHO ' + 'ADR;TYPE=work:;;' + ISNULL(Cnt.Home_Address,'') + ';' + ISNULL(Cnt.Home_City,'') + ';' + ISNULL(Cnt.Home_Municipality_Name,'') + ';' + ISNULL(Cnt.Home_CAP,'') + ';;' + @sFile
+ @crlf + 'ECHO ' + 'EMAIL;TYPE=internet,home:' + ISNULL(Cnt.Home_EMail,'') + @sFile
+ @crlf + 'ECHO ' + 'NOTE:' + ISNULL(Cnt.Note,'') + @sFile
+ @crlf + 'ECHO ' + 'REV:' + REPLACE(REPLACE(REPLACE(CONVERT(varchar,GETDATE(),120),'-',''),':',''),' ','T') + 'Z' + @sFile
+ @crlf + 'ECHO ' + 'END:VCARD' + @sFile
FROM
dbo.fun_Contacts(@iIDUser) AS Cnt
WHERE
(Cnt.IDContact = @iIDContact);
EXEC @iResult = master..xp_cmdshell @sExecute_vCardText;
select @iResult as a;
谁能告诉我我哪里做错了?
【问题讨论】:
标签: sql-server sql-server-2012