I have a problem with SQL Server 2005 system views. In SQL 2005, system tables 
(e.g. sysobjects, syscolumns) are now hidden and their contents are made 
available through special "system views". We have a CF data dictionary 
application here we have been using for years with SQL 2000 and now need to 
port it to SQL 2005.

While converting my <cfquery> tags, I have found that SELECTs against ordinary 
tables return nvarchar(max) values just fine, but SELECT's against "system 
views" always return NULL from an nvarchar(max).

The enclosed .cfm page has several queries intended to be run in SQL 2005. Each 
one works perfectly when it is pasted into Query Analyzer or Management Studio, 
and each one returns NULL when run in ColdFusion. I am running CFMX developer 
version 7.0.2.

Can anyone get these queries to run with ColdFusion? I am REALLY hoping to not 
have to re-write this application in some other language!

---------------------------tear here for .cfm executable 
-------------------------

<!--- Problem with nvarchar(max) in system views.  ColdFusion MX7 & SQL Server 
2005 --->

<!--- In the following query,
        d.name        is of type sysname
        d.type_desc   is of type nvarchar(60)
        d.definition  is of type nvarchar(max)
 --->
<cfquery name="GetConstraintDefinition" datasource="sqlchap">
        select d.name as COL1_SYSNAME,
            d.type_desc as COL2_NVARCHAR60,
            isnull(d.definition, 'NULL') as COL3_NVARCHARMAX
                from sys.default_constraints d
                join sys.columns c
                        on c.object_id = d.parent_object_id
                        and c.column_id = d.parent_column_id
                where d.parent_object_id = OBJECT_ID(N'dbo.dtproperties', N'U')
</cfquery>

<cfdump var='Selecting directly from system view "sys.default_constraints:'>
<cfdump var=#GetConstraintDefinition#>
<br>
<!--- The results from the above <cfdump> statement are as follows:
COL1_SYSNAME                    COL2_NVARCHAR60     COL3_NVARCHARMAX
------------------------------  ------------------  ----------------
DF__dtpropert__versi__6E022284  DEFAULT_CONSTRAINT  NULL


However, if the query is pasted into Query Analyzer and run, the result is:
COL1_SYSNAME                    COL2_NVARCHAR60     COL3_NVARCHARMAX
------------------------------  ------------------  --------------
DF__dtpropert__versi__6E022284  DEFAULT_CONSTRAINT  (0)

This result is saying that one of the fields in the table has a default value 
of 0.

The problem is that the nvarchar(max) field in the system view is not
correctly displayed by ColdFusion, even though the nvarchar(60) field
IS displayed correctly.
 --->



<!--- Now create a temp table with the same variable types. ColdFusion
      is able to successfully retrieve the nvarchar(max) column if it
          is filled from a literal, but not if it comes from a system view! --->
<cfquery name="GetTempTableRecord" datasource="sqlchap">
        set nocount on
        create table ##foo
                (COL1_SYSNAME      sysname,
                 COL2_NVARCHAR60   nvarchar(60),
                 COL3_NVARCHARMAX  nvarchar(max)
                )
        insert ##foo values ('TheSysname',N'TheNvarchar60',N'TheNvarcharMax is 
correctly displayed here.')
        insert ##foo
                select d.name as COL1_SYSNAME,
                                d.type_desc as COL2_NVARCHAR60,
                                isnull(d.definition, 'NULL') as COL3_NVARCHARMAX
                        from sys.default_constraints d
                        join sys.columns c
                                on c.object_id = d.parent_object_id
                                and c.column_id = d.parent_column_id
                        where d.parent_object_id = 
OBJECT_ID(N'dbo.dtproperties', N'U')
        set nocount off
        select * from ##foo
        drop table ##foo
</cfquery>
<cfdump var='Selecting directly from table in tempdb:'>
<cfdump var=#GetTempTableRecord#>
<br>


<!--- Retry the prior experiment using varchar(4000) rather than an 
nvarchar(max). --->
<cfquery name="GetVarchar4000" datasource="sqlchap">
        set nocount on
        create table ##foo
                (COL1_SYSNAME      sysname,
                 COL2_NVARCHAR60   nvarchar(60),
                 COL3_VARCHAR4000  varchar(4000)
                )
        insert ##foo values ('TheSysname',N'TheNvarchar60',N'TheNvarcharMax is 
correctly displayed here.')
        insert ##foo
                select d.name as COL1_SYSNAME,
                                d.type_desc as COL2_NVARCHAR60,
                                isnull(convert(varchar(4000), d.definition), 
'NULL') as COL3_VARCHAR4000
                        from sys.default_constraints d
                        join sys.columns c
                                on c.object_id = d.parent_object_id
                                and c.column_id = d.parent_column_id
                        where d.parent_object_id = 
OBJECT_ID(N'dbo.dtproperties', N'U')
        set nocount off
        select * from ##foo
        drop table ##foo
</cfquery>
<cfdump var='Selecting directly from table in tempdb using varchar(4000) not 
nvarchar:'>
<cfdump var=#GetVarchar4000#>
<br>
<br>
<cfdump var='All three of the above queries work correctly when pasted into 
Query Analyzer or Management Studio.'>


<cfabort>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Upgrade to Adobe ColdFusion MX7 
Experience Flex 2 & MX7 integration & create powerful cross-platform RIAs 
http:http://ad.doubleclick.net/clk;56760587;14748456;a?http://www.adobe.com/products/coldfusion/flex2/?sdid=LVNU

Archive: 
http://www.houseoffusion.com/groups/CF-Talk/message.cfm/messageid:268255
Subscription: http://www.houseoffusion.com/groups/CF-Talk/subscribe.cfm
Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.4

Reply via email to