Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
Robert_Russell
Contributor

Background


I have been busy with a personal project to recreate some of my SQL Anywhere setup that was originally running in the cloud. (I had an Linux based SQL Anywhere server on Amazon Web Services (AWS) which was terminated by AWS.)  With my original version I had used SQL Anywhere to read the, now out of service, SAP twitter account @SCNblogs. I had used SQL Anywhere’s ability to calculate hash based message authentication codes to read the @SCNblogs twitter timeline. The end result was my data geek entry blog linked below.

https://blogs.sap.com/2013/08/14/data-geek-challenge-analysing-the-scnblogs-twitter-timeline/

With SQL Anywhere I was able to generate OAuth authentication but not in a format that twitter accepted and I had to use openssl to complete the process at the last step. In my opinion this was due to unclear documentation in the Twitter API help pages. Although I was able to work around it with SQL Anywhere calling openssl commands via xp_cmdshell system procedure for the binary format required. In my original blog I thanked Eric Farrar for his blog on SQL Anywhere’s hash capabilities at this link

http://scn.sap.com/community/sybase-sql-anywhere/blog/2009/12/10/calculating-hash-based-message-auth...

It is now a  cannot be found 404 page on this site. Makes me wonder how many of my old blogs now contain dead links.

It’s new home

https://blogs.sap.com/2009/12/10/calculating-hash-based-message-authentication-codes-with-sql-anywhe...

 

On a side note, I have previously used the  the “Way Back Machine” to find missing web pages. I visited https://archive.org/web/ entered the original URL and and the original URL for Eric’s blog was saved back in 2013 at this link

https://web.archive.org/web/20130925161421/http://scn.sap.com/community/sybase-sql-anywhere/blog/200...

 

Back to my blogs main content now and I will break it into the following sections

 

  1. How I setup my Twitterbot with Twitter4J (an unofficial Java based library for the twitter API). As I intended to setup my SQL Anywhere server to tweet and not read tweets this time.

  2. How I Integrated my Twitter4J based code with SQL Anywhere

  3. How I setup my Twitterbot to tweet about the status.io feed of the newly named SAP Cloud Platform. The status.io page shows any current issues with the SAP Cloud Plaltform. It also offers an RSS feed with latest incident updates.

  4. Create an @SCNblogs like twitter account using my twitterbot and the bitly url shortener service.


 

My Twitterbot Code Setup


 

I didn’t want my main twitter account to be used to send out automated tweets - as in a worst case it may get out of control! I wanted to use a new dedicated account and set it up to tweet at my main account. I created an account called https://twitter.com/sqlany_rjruss and soon realised twitter had made some restrictions on API usage.

The API setup required a phone number and I only have one number and this is locked against my main Twitter account. So I had to search for a workaround/solution. In the end I followed the information in this post to register my bot account @sqlany_rjruss to link back to my main twitter account.

http://dghubble.com/blog/posts/twitter-app-write-access-and-bots/

Once I had my 4 tokens listed in a file called .twurlrc, as per Dalton’s blog link, I had a write enabled app. This meant I could proceed to setup my Java code to send out tweets.

Using Java project Twitter4J

http://twitter4j.org/en/

I only used the core Jar file from the project

The following is the example code I used. I chose to hard code the authorisation tokens in my code.

 

Example Code

 
import twitter4j.Status;

import twitter4j.Twitter;

import twitter4j.TwitterException;

import twitter4j.TwitterFactory;

import twitter4j.auth.AccessToken;

import twitter4j.auth.RequestToken;
import twitter4j.conf.ConfigurationBuilder;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public final class tweet {

public static void main(String[] args) {

if (args.length < 1) {
System.out.println("Usage: java -cp \".;./twitter4j-core-4.0.4.jar\" tweet [text]");
//MAC usage java -cp "tweet:.:twitter4j-core-4.0.4.jar" tweet "macbook pro"
System.exit(-1);
}
String consumerKey = "{CONSUMER_KEY}";
String consumerSecret = "{CONSUMER_SECRET}";
String accessToken = "{ACCESS_TOKEN}";
String accessSecret = "{ACCESS_SECRET}";
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey(consumerKey)
.setOAuthConsumerSecret(consumerSecret)
.setOAuthAccessToken(accessToken)
.setOAuthAccessTokenSecret(accessSecret);

try {
Twitter twitter = new TwitterFactory(cb.build()).getInstance();
twitter.updateStatus(args[0]);
} catch (TwitterException e) {
System.err.println("Error occurred while updating the status!");
System.err.println(e);
}
}
}


 

 

I have tested Java 7 and 8 to compile the code with javac as part of the JDK I was using.

I tested the code on Windows 10 and Mac Yosemite and Sierra operating systems.

 

For Windows 10 the follow command successfully posted a tweet

 







Usage:  java -cp ".;./twitter4j-core-4.0.4.jar" tweet “windows 10"

 

For my Mac’s I found I had to alter the path for the class path to get the tweets posted.

Usage: 

 







Usage: java -cp "tweet:.:twitter4j-core-4.0.4.jar" tweet "macbook pro"

SQL Anywhere’s JAVA external environment


 

SQL Anywhere can use Java as an external environment and a link to the help for SQL Anywhere 17 is below. One of my findings at the end of my setup was the difference between the Java environment returning a result set or not. My example code does not return anything and only writes out. It seems that the external environments offer a powerful extension possibilities to SQL Anywhere. I just need to learn more Java (or other compatible external code) to take advantage of it.

http://dcx.sap.com/index.html#sqla170/en/html/8160578b6ce2101480bff9bdb43fee68.html

To capture errors while troubleshooting I found that starting SQL Anywhere and capturing log files was useful. E.g.

dbsrv17 -zoc "C:\sql17logs\log" -o "C:\sql17logs\dblog"

 

One example error below was triggered when I was testing with exactly the same tweet. To get around this I added a timestamp to all my tweets to make them unique!!

 

*****

. 403:The request is understood, but it has been refused. An accompanying error message will explain why. This code is used when requests are being denied due to update limits (https://support.twitter.com/articles/15364-about-twitter-limits-update-api-dm-and-following).

message - Status is a duplicate.

code - 187

Relevant discussions can be found on the Internet at:

http://www.google.co.jp/search?q=2fc5b7cb or

http://www.google.co.jp/search?q=0ea287d2

TwitterException{exceptionCode=[2fc5b7cb-0ea287d2], statusCode=403, message=Status is a duplicate., code=187, retryAfter=-1, rateLimitStatus=null, version=4.0.4}

*****

 

I found that the SQL Anywhere had a standard JAVAVM as part of the install on Windows 10.

 

SELECT db_property('JAVAVM');



There is an Option to change the location of Java

ALTER EXTERNAL ENVIRONMENT JAVA

 LOCATION 'c:\\jdk1.8.0\\jre\\bin\\java.exe';

 

I copied the code for Twitter4J into a dedicated directory.



In SQL Central entered the Java external environment to import my class and the Twitter4J jar file.



I followed the wizard to add my tweet.class



Followed the wizard to import the core Twitter4J jar file







 

I then set up a procedure to call my class which would not return a result (option V)

 

 
CREATE PROCEDURE "dba"."sqlanytweet"( in "arg1" long nvarchar )

external name 'tweet.main([Ljava/lang/String;)V' language "JAVA"

I then tested calling the procedure from interactive SQL on my windows instance.



As mentioned earlier to prove to myself that this would work on other systems I setup my Mac version of SQL Anywhere to tweet using the same Java code, as shown below.



 

Now, what to tweet about?

 

Reading the Status.IO RSS feed for the SAP Cloud Platform


As mentioned in Moya Watson's blog Transparency Alert: Public HCP Status Page now LIVE! there is an SAPCP status page.

 

On the SAPCP’s page http://sapcp.statuspage.io/ there is a subscribe function which I used to get details about the RSS feed. I have no direct knowledge of how the feed is configured or updates triggered. So the following is all in theory for a demo as I have assumed how it will work and the following is based upon that guess work. I will split it into the following sections,

 

  1. Setup Table to collect SAP HCP status page information

  2. Setup Function and Procedure to read the RSS feed and populate my control table

  3. Setup Function and Procedure to tweet any updates


 

Setup Table to collect SAP HCP status page information


First I setup a table matching the RSS feed and adding one column to use to control how I tweet about any updates.



All columns matched an “item” in the RSS feed for the HCP status.io feed. Apart from the highlighted “tweeted” column which I will use to tweet any updates. I chose to use statusscp for the table name as the HANA Cloud Platform is now known as the SAP Cloud Platform (scp). I failed to keep this naming convention everywhere and still refer to HCP (some screen shots will have HCP but the real thing is now SCP) but then again it should be NEO.

 

Setup Function and Procedure to read the RSS feed and populate my control table


 

As the status RSS feed is XML based and I am familiar with OpenXML features of SQL Anywhere then it is an ideal way for me to read the HCP status.io activity feed (and covered an OpenXML approach here as well)

 

First I downloaded the certificate from the RSS status page



The above screenshot is now out of date as the certificate (and link) has changed.

 

Updated version below and any new certificates would have to be downloaded for any subsequent changes to the certificate. Maybe I should have one big certificate file containing all known root certificates.



I saved the file into the twitter directory I created earlier as I will need to reference this in my openxml function,



Next I setup the function and procedure in SQL Anywhere that I will use to read the RSS feed (the function has the certificate reference).

 

 
ALTER FUNCTION "dba"."statusscp_f"( in "u" long varchar )
returns long nvarchar
url '!u'
certificate 'file=c:\\twitter\\hcpstatus.cer'
type 'HTTP:GET'

ALTER PROCEDURE "dba"."statusscp_p"() result ( title LONG nvarchar, "description" LONG nvarchar, pubDate LONG nvarchar, link LONG nvarchar, guid LONG nvarchar)
BEGIN
DECLARE K long VARCHAR ;
DECLARE S long VARCHAR ;
DECLARE BKS long VARCHAR ;
DECLARE h long VARCHAR;
DECLARE u long VARCHAR;
DECLARE idc long varchar;
CALL sa_set_http_option('SessionTimeout', '5');
SET TEMPORARY OPTION remote_idle_timeout = 100;
set u = 'https://saphcp.statuspage.io/history.rss';

MERGE INTO statusscp(title, "description", pubDate, link, guid )
USING (
select title, "description", pubDate, link, guid
from openxml( statusscp_f(u) , '/rss/channel/item' , 1 , '<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"/>' )

with(
title long nvarchar 'title' ,
"description" long nvarchar 'description' ,
pubDate long nvarchar 'pubDate' ,
link long nvarchar 'link' ,
guid long nvarchar 'guid'
)
) AS sourceData( title, "description", pubDate, link, guid)

ON statusscp.pubDate = sourceData.pubDate
WHEN NOT MATCHED THEN INSERT
WHEN MATCHED THEN UPDATE;
END




 

It is unclear to me how many incidents are kept on the SAPCP status.io RSS feed however my approach was to setup a job to keep a table updated based on the published data pubDate field.

 

Example of running the procedure followed by a select on the statusscp table


Setup Function and Procedure to tweet any updates


 

I setup the statusscp table in SQL Anywhere with a column “tweeted” which I would use to trigger and record actual tweets via my twitterbot.

 

Example  procedure of how I do this is below.

 

 
ALTER PROCEDURE "dba"."status_tweet_scp_p"() result ( outp LONG nvarchar)

BEGIN
DECLARE TW long VARCHAR ;
DECLARE DCR long VARCHAR ;
DECLARE MSG long VARCHAR;
DECLARE TWHO long varchar;
DECLARE DT long varchar;
DECLARE WORDSEARCH long nvarchar;

set TWHO='@rjruss';
CALL sa_set_http_option('SessionTimeout', '5');
SET TEMPORARY OPTION remote_idle_timeout = 100;
-- where title like '%Trial%' or title like '%Europe%' or title like '%All%';
--SELECT title, "description" as de, pubDate, link FROM "dba"."statusscp" where tweeted is null
FOR names AS curs INSENSITIVE CURSOR FOR
SELECT title, "description" as de, pubDate, link FROM "dba"."statusscp" where tweeted is null and ( title like '%Trial%' or title like '%Europe%' or title like '%All%')
DO
set DT = pubDate;
set WORDSEARCH = REGEXP_SUBSTR( de, '>Resolved<|>Identified<|>Investigating<' );
set MSG = string( TWHO, ' ', title, ' ', link, ' STATUS:', WORDSEARCH , ' :', DATEFORMAT(GETDATE(), 'RRHHNNSS') );

--select MSG from dummy;
select "dba"."sqlanytweet"( MSG );
UPDATE "dba"."statusscp"
SET tweeted='sent'
WHERE pubDate=DT;
END FOR;
select 'end' from dummy;
--testing create only one table entry and set to null before calling this procedure
--update "dba"."statusscp" set tweeted = NULL;
--call status_tweet_scp_p()
END

This line in bold is used to only tweet about Trial and Europe and All incidents. This way it will not tweet about US or other data centers which I have no interest ;).

SELECT title, "description" as de, pubDate, link FROM "dba"."statusscp" where tweeted is  null and ( title like '%Trial%' or title like '%Europe%' or title like '%All%')

 

This line in bold uses SQL Anywhere regular expression to search the RSS feed for a status text. It works on the understanding that SAP provide updates with Resolved, Identified and Investigating and in this order. As I take advantage of the default behaviour of REGEXP_SUBSTR to stop at the first match. If SAP or the status.io functionality make changes to these status messages then the code will no longer work as intended.

set WORDSEARCH = REGEXP_SUBSTR( de, '>Resolved<|>Identified<|>Investigating<' );

 

The final line in bold sends a formatted tweet at my main account via the sqlany_rjruss twitterbot. This uses the procedure I covered in my Twitter4J setup earlier.

select "dba"."sqlanytweet"( MSG );

 

I chose to control the process via a batch job on my windows 10 computer which would call an sql script. The sql would trigger the read of the RSS feed and send out any tweets as necessary, as per the following. I used the bat file via task scheduler in windows. Sometimes I think the moon and the stars have to be aligned to trigger anything via task scheduler, so a good link for me to have handy is the troubleshooting guide for task scheduler...

 

 

statusHCP.bat file

cd c:\twitter

dbisql -c  "DSN=STATUSHCP;UID=dba;PWD={PASSWORD};IDLE=4" -nogui  statusHCPtweet.sql

 

statusHCPtweet.sql file

call statusscp_p();

call status_tweet_scp_p();

exit;

 

An example tweet as follows



 

Now onto the final part of my blog.

 

Creating a Twitter Account based on @SCNblogs


 

As mentioned right at the start of my blog the @SCNblogs twitter account is no longer active and locked down. However I have used this account to collect some data about the blogging here on the old community. The @SCNblogs account tweeted about any new blogs on the site. So when I discovered the RSS feeds for this new site it was ideal as I know SQL Anywhere can read these  feeds. It seemed a logical thing for me to try and create a new twitter version of @SCNblogs. It would have to use the Bitly URL shortening service as that was key to my previous collection methods. The great thing about bitly service is that the statistics available for the shortened URLs are publicly available.

 

A couple of things I learnt about the RSS feeds for this blogging site.

Main feed page is at.

     https://blogs.sap.com/feed/

You can page through the RSS feeds, as an example page 33

     https://blogs.sap.com/feed/?paged=33

Also you can do this by date.

     https://blogs.sap.com/2017/03/04/feed/

Also page through by date

     https://blogs.sap.com/2017/03/03/feed/?paged=2

If you go back to far e.g paged=1000020002 :0 it will generate an error.....

I did use the RSS feeds as a way to collect some statistics about the blogging here on the SAP Community. However there is an issue.

Data Quality Issues in the RSS feeds

The SAP provided RSS feeds are inconsistent. They do not contain the "primary" or "secondary" tags, the main item listed is "Uncategorized" which I assume is the place for primary/secondary tags - but no tags appear. Also a number of blogs with user tags do not appear in the RSS feeds either, there is no way for me to actually analyse why this should be the case.

I have chosen to put the stats I collected in the Coffee Corner part of this site at this link

https://answers.sap.com/articles/139632/status-update-counting-blogs-user-tags-and-comment.html

However a couple of stats which I found important when creating a tweet based on a 140 character limit. I wanted to put the title and name of the author in the tweet. But needed someway to limit this, so not to go over the tweet limit and generate an error (as this would prevent any tweet from being sent).

The average character length of name of the creator and blog title on SAP Community blogs is as follows (from my data - not official :))



 

So I used these two figures to limit my tweet

 

set MSG = string( TWHO, ' ', SUBSTRING( title, 1, 58 ), '.. ', SHORTURL , ' by:', SUBSTRING( cr, 1, 14 ), '.. ',  DATEFORMAT(GETDATE(), 'RRHHNNSS') );

 

Also the code provided below will tweet blogs with "SQL Anywhere" in the title. The select statement below checks that the blog has not been tweeted already and contains sql anywhere in the title.

SELECT top 3 title, "description" as de, guid as gu, creator as cr FROM "dba"."blogsscn" where tweeted is null and ( title like '%sql anywhere%') order by title asc

As shown below. I am now free to adapt the code to pick on other topics of interest to generate tweets.

 

 



 

I setup bitly this time by using the very helpful page they have to generate an authorisation token.

https://bitly.com/a/oauth_apps

With this token and bitly certificate downloaded I setup a function and procedure to get a shortened URL from the SAP Community blog link. Bitly still offer XML results so again I used openxml to extract the shortened URL.

Thanks for reading and I finish with the code that is used in my SAP Community blogs twitterbot.

 
ALTER FUNCTION "dba"."bitly_f"( in "u" long varchar )
returns long nvarchar
url '!u'
certificate 'file=c:\\bitly\\bitly.cer'
type 'HTTP:GET'

The procedure was used to test the BITLY process

 
ALTER PROCEDURE "dba"."bitly_p"(IN tu long varchar) result ( title LONG nvarchar, "description" LONG nvarchar, pubDate LONG nvarchar, link LONG nvarchar, guid LONG nvarchar)
BEGIN
DECLARE K long VARCHAR ;
DECLARE S long VARCHAR ;
DECLARE BKS long VARCHAR ;
DECLARE h long VARCHAR;
DECLARE u long VARCHAR;
DECLARE idc long varchar;
CALL sa_set_http_option('SessionTimeout', '5');
SET TEMPORARY OPTION remote_idle_timeout = 100;

set u = string( 'https://api-ssl.bitly.com/v3/shorten?access_token={ACCESS+TOKEN}&format=xml&longUrl=', HTTP_ENCODE( tu ));

select burl, "hash", global_hash, long_url, new_hash
from openxml( bitly_f(u) , '/response/data' , 1 )

with(
burl long nvarchar 'url' ,
"hash" long nvarchar 'hash' ,
global_hash long nvarchar 'global_hash' ,
long_url long nvarchar 'long_url' ,
new_hash long nvarchar 'new_hash'
)

;

END

 

This procedure actually controls the tweeting.

 
ALTER PROCEDURE "dba"."blogsSCN_tweet_bitly"() result ( outp LONG nvarchar)

BEGIN
DECLARE TW long VARCHAR ;
DECLARE DCR long VARCHAR ;
DECLARE MSG long VARCHAR;
DECLARE TWHO long varchar;
DECLARE DT long varchar;
DECLARE WORDSEARCH long nvarchar;
DECLARE SHORTURL long nvarchar;
DECLARE u long nvarchar;

set TWHO='@rjruss';
CALL sa_set_http_option('SessionTimeout', '5');
SET TEMPORARY OPTION remote_idle_timeout = 100;
-- where title like '%Trial%' or title like '%Europe%' or title like '%All%';
--SELECT title, "description" as de, pubDate, link FROM "dba"."statusscp" where tweeted is null
FOR names AS curs INSENSITIVE CURSOR FOR
--SELECT top 3 title, "description" as de, guid as gu, creator as cr FROM "dba"."blogsscn" where tweeted is null and ( title like '%HANA%' or title like '%spatial%' or title like '%asksap%') order by title asc
SELECT top 3 title, "description" as de, guid as gu, creator as cr FROM "dba"."blogsscn" where tweeted is null and ( title like '%sql anywhere%') order by title asc
DO
set DT = gu;
set WORDSEARCH = REGEXP_SUBSTR( de, 'sap basis|sql anywhere' );

set u = string( 'https://api-ssl.bitly.com/v3/shorten?access_token={ACCESS_TOKEN}&format=xml&longUrl=', HTTP_ENCODE( gu ));

select burl into SHORTURL
from openxml( bitly_f(u) , '/response/data' , 1 )

with(
burl long nvarchar 'url' ,
"hash" long nvarchar 'hash' ,
global_hash long nvarchar 'global_hash' ,
long_url long nvarchar 'long_url' ,
new_hash long nvarchar 'new_hash'
) ;

set MSG = string( TWHO, ' ', SUBSTRING( title, 1, 58 ), '.. ', SHORTURL , ' by:', SUBSTRING( cr, 1, 14 ), '.. ', DATEFORMAT(GETDATE(), 'RRHHNNSS') );

--select MSG from dummy;
select "dba"."sqlanytweet"( MSG );
UPDATE "dba"."blogsscn"
SET tweeted='sent'
WHERE guid=DT;
END FOR;
select 'end' from dummy;
--testing create only one table entry and set to null before calling this procedure
--update "dba"."statusscp" set tweeted = NULL;
--call status_tweet_scp_p()
END


To populate a control table with the SAP Community blogs I loop around this procedure. I also have a category table but in my opinion the data for the user tags is inconsistent at source - so not reliable.

 
ALTER PROCEDURE "dba"."blogsscn_p"( in "arg1" long nvarchar ) result ( title LONG nvarchar, link LONG nvarchar, pubDate LONG nvarchar, creator long nvarchar, guid LONG nvarchar, "description" LONG nvarchar, commentcount LONG nvarchar )
BEGIN
DECLARE K long nVARCHAR ;
DECLARE S long nVARCHAR ;
DECLARE BKS long nVARCHAR ;
DECLARE h long nVARCHAR;
DECLARE u long nVARCHAR;
DECLARE idc long nvarchar;
DECLARE xmr XML;
--
CALL sa_set_http_option('SessionTimeout', '5');
SET TEMPORARY OPTION remote_idle_timeout = 100;
--set u = 'https://blogs.sap.com?feed=rss2';
--paged=
set u = string( 'https://blogs.sap.com/feed?paged=', arg1 );

select blogsscn_f(u) into xmr;
--replace especially for you Biao
--https://blogs.sap.com/2016/11/21/money-market-enhancement-new-added-in-ehp8-2-process/
--shame that primary tags and sometimes no tags e.g. this blog missing tags in RSS feed
--https://blogs.sap.com/2016/11/20/installing-hana-express-on-aws-detailed-walkthrough/
set xmr = replace(xmr, '','');
MERGE INTO blogsscn( title, link, "comments", pubDate, creator, guid, "description",commentcount )

USING (

select title, link, "comments", pubDate, creator, guid, "description",commentcount
from openxml( xmr , '/rss/channel/item' , 1 , '<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"/>' )

with(
title long nvarchar 'title' ,
link long nvarchar 'link' ,
"comments" long nvarchar 'comments' ,
pubDate long nvarchar 'pubDate' ,
creator long nvarchar 'dc:creator' ,
guid long nvarchar 'guid' ,
"description" long nvarchar '.',
commentcount integer 'slash:comments'
)

) AS sourceData( title, link, "comments", pubDate, creator, guid, "description", commentcount)

ON blogsscn.pubDate = sourceData.pubDate
WHEN NOT MATCHED THEN INSERT
WHEN MATCHED THEN UPDATE;

--https://www.google.co.uk/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=sql+anywhere+openxml+only+returns+limited+characters&*
--love the information available for sql anywhere on SCN
--https://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=380667448

insert into blogscat
select guid, category , creator
from openxml( xmr , '/rss/channel/item/category' , 1 , '<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"/>' )

with(
guid long nvarchar '../guid' ,
category long nvarchar '.' ,
creator long nvarchar '../dc:creator'
)

END

 

 

.
Labels in this area