cfqueryparam with uniqueidentifier type in table - coldfusion

I have a query where I am attempting to insert values into a table and one of these values (ImportID) is of type uniqueidentifier in the database. I have looked in the adobe CF documentation and saw that both cf_sql_char and cf_sql_idstamp should work for the cfquery param for my uniqueidentifier type. I also read this thread which says the same thing: What is the most appropriate Coldfusion cfsqltype to use for MS SQL's uniqueidentifier field type?
I have found a few other places that use the "maxlength" parameter for the cfqueryparam tag and cf_sql_char as the type but have not been able to make my code work. I keep getting an error along the lines of "Conversion failed when converting from a character string to uniqueidentifier." I'm including my code where I generate the UID and attempt the insert below (I replaced some of the variable names and took out all of the other columns for the import):
<cfscript>
ImportID = createUUID();
</cfscript>
<cfquery name="INSERTTableName" datasource="#Application.Datasource#">
INSERT INTO TableNameImport(
ImportID
)
VALUES(
<cfqueryparam value="#variables.ImportID#" cfsqltype="CF_SQL_CHAR">
)
</cfquery>
Any help would be greatly appreciated. Thanks in advance.
*********************************EDIT********************************
Found the answer:
<cfquery name="INSERTTableName" datasource="#Application.Datasource#">
DECLARE #ImportID uniqueidentifier
SET #ImportID = NEWID()
INSERT INTO TableNameImport(
ImportID
)
VALUES(
#ImportID
)
</cfquery>
The problem was that the UUID created from the coldfusion call is a different format from the one created in Microsoft SQL Server.

You are correct. SQL uses a GUID and createUUID manks a UUID. Both are 32hex value but use a differnt text format (location of dashes). And the use a different calculation to generate the random value. You can utilize UUID's if you change the text formating to have the GUID dash locations or send the binary value. For your example above that works you might also want return the GUID if cf needs a reference to that value.

Related

How do I add SQL to a coldfusion Query

I am creating a new query object with
<cfset LOCAL.Query = QueryNew( "" ) />
I am then building up a complicated data set from an array that was passed in.
My query object looks perfect.
How do I then add the SQL text and datasource to the query so that I can execute it?
I am going to be inserting the data using a passed in datasource and insert statement.
If I'm understanding you correctly, in order to use SQL and retrieve data from your query object you will use CFQUERY. Instead of a 'datasource' attribute you will use 'dbtype="query"'. The table name of the query will be your query object. For example:
<cfquery dbtype="query" name="myQry">
SELECT * FROM LOCAL.Query
</cfquery>
You cannot add new records with an INSERT statement. You must use the function: QUERYADDROW() and, possibly, QUERYSETCELL().
For instance, :
<cfset queryAddRow(LOCAL.Query, {"id"=1,"title"="Hello world"})>
Or:
<cfset queryAddRow(LOCAL.Query)>
<cfset querySetCell(LOCAL.Query, "id", "1")>
<cfset querySetCell(LOCAL.Query, "title", "Hello world")>
Dan answered the question for me.
I was hoping to be able to modify the query object and add the datasource and SQL but after much study I was unable to do so.
The correct answer is DanĀ“s comment about a new query object.

Comparing two character values in a Coldfusion cfquery

I have a database field which contains VARCHAR values like
XY23(CX Web)
AND I am writing a Query of Queries like
SELECT qPdfs.filename, qPdfs.code, qObjects.id
FROM qPdfs, qObjects
WHERE qPdfs.code = qObjects.code
OR like
SELECT qPdfs.filename, qPdfs.code, qObjects.id
FROM qPdfs, qObjects
WHERE <cfqueryparam value="#qObjects.code#" cfsqltype="CF_SQL_VARCHAR"> = <cfqueryparam value="#qPdfs.code#" cfsqltype="CF_SQL_VARCHAR">
But I am getting an error message like
XY23(CX Web) must be interpretable as a valid number in the current locale.
Any help?
Thank you
Are both of the database columns type varchar? If so, the QoQ is probably applying some implicit conversion based on the contents of the columns. If some of the codes are all numeric, the QoQ may be attempting to cast them to numbers internally before performing the comparison. Hence the error. cfqueryparam won't help here, because it can only be used on literals, not query columns. If a straight equality comparison ie ColName = ColName causes that error, try casting instead:
WHERE CAST(qPdfs.code AS VARCHAR) = CAST(qObjects.code AS VARCHAR)
NB: QoQ string comparisons are case sensitive, so you may want to convert the columns to upper/lower case first.

PreparedStatement.setNString(int,java.lang.String) error trying to use Query of Queries

I have a simple Query of Queries statement like this:
<cfquery name="rsProductTypeID" dbtype="query">
SELECT
ProductTypeID
FROM
rsProductTypes
WHERE
ProductType = <cfqueryparam value="Computers" cfsqltype="cf_sql_nvarchar"/>;
</cfquery>
All it is doing is asking for the primary key value (ProductTypeID) from the recordset rsProductType depending on which ProductType we are asking for.
For some reason the above query gives me this error:
PreparedStatement.setNString(int,java.lang.String)
But if I change the Query of Queries and remove the <cfqueryparam> part and replace it with normal text, then it works fine. Here is the working code:
<cfquery name="rsProductTypeID" dbtype="query">
SELECT
ProductTypeID
FROM
rsProductTypes
WHERE
ProductType = 'Computers';
</cfquery>
I can't tell what the difference is between the code that is causing it to fail when using <cfqueryparam> and not.
I think I figured it out... when ColdFusion returns a recordset, it doesn't maintain the original datatype from the database. In my database ProductType is defined as nvarchar(50) but ColdFusion returns it as varchar format. So the cfsqltype attribute was causing the error. I changed the cfsqltype attribute to cf_sql_varchar and it works fine. Very annoying but what can you do.
I posted it as a self-answer in case anyone else gets this error. Not sure if that's against the rules or not.
cf_sql_nvarchar is not a valid value for the cfsqltype attribute of cfqueryparam
Docs: https://wikidocs.adobe.com/wiki/display/coldfusionen/cfqueryparam

CF QoQ is throwing runtime error. "Column reference is not a column in any of the tables of the FROM table list."

In my code, I first create the Query Object:
<cfset memberData = QueryNew('slug,pos,firstname,lastname,email') />
<cfset temp = QueryAddRow(memberData, #numMembers#) />
<!--- LOOP POPULATES QUERY OBJECT --->
<cfloop...</cfloop>
I can then verify that it has been populated by running the following (which outputs as expected):
<cfoutput query="memberData">
#slug# - #pos#<br>
</cfoutput>
I then try to query the memberData Query Object and all hell breaks loose. If I run:
<cfquery name="members" dbtype="query">
SELECT slug,pos,firstname,lastname
FROM memberData
WHERE slug = #slug#
</cfquery>
I get this error:
Query Of Queries runtime error.
The select column reference [university] is not a column in any of the tables of the FROM table list.
In the output test mentioned above, I can verify that "university" is one of the values in the slug column. Clearly I'm missing something in my approach, but I'm baffled as to what it might be. Any help would be greatly appreciated!
Query Of Queries runtime error.
The select column reference
[university] is not a column in any of the tables of the FROM table
list
Your error was caused by absence of quotes in where clause and nothing else:
This expression find rows where the value in slug column equals the value in CF slug variable (String):
WHERE slug = '#slug#'
On the other hand this expression means find rows where value in the slug column equals the value contained in the column named in the CF slug variable (String):
WHERE slug = #slug#
The most likely cause of why you needed to change to SELECT * is CF query caching. So changing it back now should solve the problem. And always use <cfqueryparam .../> as suggested by "Al Everett"
Well, it's not quite answering the question asked, but it's close enough for what I needed:
<cfquery name="members" dbtype="query">
SELECT *
FROM memberData
WHERE slug = '#slug#'
</cfquery>
I had tried the wrapping #slug# in single quotes prior to posting with no success, but doing that plus changing the query to SELECT * fixed the issue. For my content, * only adds one more value retrieved, so not really a problem in slowing down the process.

Is there a way to escape and use ColdFusion query reserved words as column names in a query of query?

I'm working with a query that has a column named "Date."
The original query returns okay from the database. You can output the original query, paginate the original query, get a ValueList of the Date column, etc.
Query of Query
<cfquery name= "Query" dbtype= "query">
select
[Query].[Date]
from [Query]
</cfquery>
Response from ColdFusion
Query Of Queries syntax error. Encountered "Date. Incorrect Select
List,
Typically, I use descriptive names so I haven't run across this issue previously.
In this case, I'm working with a stored procedure that someone else wrote. I ended up modifying the stored procedure to use a more descriptive column name.
I have a service I use for transforming, searching and sorting queries with ColdFusion. I'm curious to know the answer to my original question, so that I can modify my service to either throw a better error or handle reserved words.
Is there a way to escape and use ColdFusion query reserved words as column names in a query of query?
The following code works fine for me:
<cfset query = queryNew("date")>
<cfdump var="#query#">
<cfquery name= "Query" dbtype= "query">
select
[Query].[Date]
from [Query]
</cfquery>
<cfdump var="#query#">
In standard mysql you'd "escape" the fields by using the ` character.
So for example:
select `query`.`date` from `query`
Try that and see if it works?