Syntax error in an Open-SQL statement - sql

What's wrong with this statement?
SELECT aufk~aufnr
zmm_limit_co~vd zmm_limit_co~matkl_code
zmm_limit_matkl~sign
FROM aufk
JOIN zmm_limit_co ON zmm_limit_co~auart = aufk~auart
left JOIN zmm_limit_matkl
on zmm_limit_matkl~matkl = zmm_limit_matkl~matkl_code
INTO CORRESPONDING FIELDS OF table lt_input
WHERE aufk~aufnr = <lf_new_pos>-aufnr.
When I'm trying to execute program, ABAP gives me an error:
'The elements in the "SELECT LIST" list must be separated using commas.'
I suppose, that the error is somehow connected with JOINs, when I'm removing "left" from it - it's compiling just fine, but with it.

You are (probably inadvertently) mixing the old (now obsolete) and new syntax of the OpenSQL SELECT statement, triggering this rather less-than-helpful error message. Check the release-specific change notes for some details on the changes. However, in the example given, I believe that the second join condition is the problem: You're not joining the contents of zmm_limit_matkl with any of the other two tables, but with itself. That doesn't look right and might confuse the compiler.

Related

A .NET Framework error occurred during execution of user-defined routine or aggregate "No extended information available." calling geography

I'm trying to pull lat/lon coordinates from one table and see if they intersect a particular area using geometry::STIntersect. However, I get the error in the title after the query has started running and producing results. This only happens intermittently, though. Below is a pseudocode example of what I'm trying to do:
SELECT *
FROM table_with_lat_lons
INNER JOIN(SELECT id,1 include
FROM table_with_lat_lons
INNER JOIN table_with_geog_boundaries
ON table_with_geog_boundaries.geog.STIntersects(geography::Point(ISNULL(CAST(y_Coord as float),0.0), ISNULL(Cast(x_Coord as float),0.0), 4326)) = 1) bounds
ON table_with_lat_lons.id =bounds.id
WHERE bounds.include=1
Wrapping everything into a with...then will fix the error, but that's not a viable solution for this issue for me

Why am I getting a `Data type mismatch` error when I add "CF" to the end of my search string in a SQL statement in Access?

The following query (qryCurLotNewProducts) produces a data set that I want process further with another query (qryBNP_CFRecordset):
//qryCurLotNewProducts
SELECT tblNewProducts.*
FROM tblNewProducts INNER JOIN tblCurLot ON (tblCurLot.CatalogNum = tblNewProducts.CatalogNum) AND
(tblNewProducts.LotNum = tblCurLot.CurLot);
When I run this second query to list only the "CF" products found in the first query, I get the `Data type mismatch in criteria expression' error.
//qryBNP_CFRecordset
SELECT qryCurLotNewProducts.*, tblABCategory.UNSPSC, tblAmount.ProductSize
FROM tblAmount RIGHT JOIN (tblABCategory RIGHT JOIN qryCurLotNewProducts ON tblABCategory.ABCategory = qryCurLotNewProducts.ABCategory) ON tblAmount.Amount = qryCurLotNewProducts.Amount
WHERE (((qryCurLotNewProducts.CatalogNum) Like "A700-###CF") AND ((qryCurLotNewProducts.DateEntered) Between #1/1/2000# And #3/1/2020#))
ORDER BY qryCurLotNewProducts.CatalogNum, Abs(qryCurLotNewProducts.LotNum);
If I remove the CF from the search string (so "A700-###"), the query correctly outputs a list containing all items that contain that pattern:
If I use strings like "A700-####F" or "A700-###ZZ" or other combinations like that, I don't get an error but rather an empty results set.
Notably, "A700-001CF", "A700-002CF", etc all create the data type error. It seems there is something about the CF key combination that is causing trouble.
Has anybody else ever seen this issue? Do I need to use some kind of delimiter to tell SQL to not view CF as some kind of special switch?
Abs(qryCurLotNewProducts.LotNum) wont work with the values for Products ending in CF. Your LotNum-Column has a text-type.
Edit: Your LotNum-Column has a text-type as you can see in your first screenshot.

Access 2007 CInt Query Issue

There is probably a pretty basic answer to this question, but I'm pulling my hair out trying to resolve my issue. I'm using Access 2007.
My query is shown below:
SELECT Pricing.*
FROM OrderReceipt_be
INNER JOIN Pricing ON CInt(OrderReceipt_be.[Pricing Table Option Code]) = Pricing.ID
WHERE OrderReceipt_be.[PO_Number] = PONumber();
For whatever reason, the [PO_Number] field is stored as text against my key which is a long int. This is why I'm trying to convert it to an integer.
However, when I run my query I get the error
"Compile error. in query expression CInt(OrderReceipt_be.[Pricing
Table Option Code]) = Pricing.ID".
I've done some basic research and it seems like the most common issue is that I'm missing a reference library. Howver, having gone through the entire list, I don't see any references that are tagged as "Missing" so it must be something else. I've also tried disabling and re-enabling all enabled reference libraries to see if that helps, but so far nothing.
Any thoughts?
If you can have codes of Null, try:
SELECT Pricing.*
FROM OrderReceipt_be
INNER JOIN Pricing ON Val(Nz(OrderReceipt_be.[Pricing Table Option Code])) = Pricing.ID
WHERE OrderReceipt_be.[PO_Number] = PONumber();
or try the reverse conversion:
SELECT Pricing.*
FROM OrderReceipt_be
INNER JOIN Pricing ON OrderReceipt_be.[Pricing Table Option Code] = CStr(Pricing.ID)
WHERE OrderReceipt_be.[PO_Number] = PONumber();

Using a Join query with ignited datatables trying to get a where with two conditions

I am attempting to pull data from mysql database using codeigniter and ignited datatables. I have no troubles pulling the join query with a single where clause, but when I try to add a WHERE x OR y, I can't seem to get it working. Here is the basic code that works fine:
$table = 'test_base';
$table2 = 'lab';
$this->datatables->select('test_base.idlab');
$this->datatables->from($table);
$this->datatables->join($table2, 'test_base.idlab = lab.idlab');
$this->datatables->where('lab.idaccount',$idaccount);
If I wanted to put multiple conditions in the query, I see from the manual that I can put multiple conditions in an array, but this seems to only do an AND, not an OR statement.
I then see that I may be able to create my own sql query using the following:
$this->datatables->where('column != "string"');
So, I tried this:
$this->datatables->where("`lab`.`idaccount`= $idaccount OR `lab`.`idlab` = 0");
SELECT `test_base`.`idlab`
FROM (`test_base`)
JOIN `lab` ON `test_base`.`idlab` = `lab`.`idlab`
WHERE `lab`.`idaccount`=` 124 OR `lab`.`idlab` = 0
ORDER BY `idtest` asc
The issue is that there is an extra (`) in the WHERE `lab`.`idaccount` = `<-here and I'm not sure how to get rid of it.
As #Ehecatl suggests, I got it working by entering the full query into the (). There were no examples on the CodeIgniter website or anywhere else I could find. Still new to CodeIgniter so maybe this will also help others.
Resolution is to put the query string in the $this->datatables->where(); and removing all the single quotes.
$this->datatables->where("lab.idaccount = $idaccount OR lab.idlab = 0");

Yii Join Table Command

I'm currently working on Yii SQL Injection. I have the following command sql command to run:
SELECT p.email, p.email_secret, p.verificationcode, r.name
FROM personal p
JOIN profile r
ON p.email='example#example.com'
I have written the following code with yii:
$connection=Yii::app()->db;
$command=$connection->createCommand();
$command->select('p.email, p.email_secret, p.verificationcode, r.name');
$command->from('personal p');
$command->join('profile r', 'p.email = r.email');
$command->where('p.email=:email', array(':email'=>'yeoh.chan1#gmail.com'));
$rows=$command->queryAll();
I would like to know where this would be vulnerable SQL Injection and if so, what would be a better approach to deal with table joinings.
Since this has no variables in it, there is no possibility for SQL injection. However, I am guessing that you are planning to pass the email address in as a parameter, and since you have the :email parameter marker you are safe.
Just a tidbit here, you don't have to repeat $command-> on every line. You can write it like this:
$connection=Yii::app()->db;
$command=$connection->createCommand();
$command->select('p.email, p.email_secret, p.verificationcode, r.name')
->from('personal p')
->join('profile r', 'p.email = r.email')
->where('p.email=:email', array(':email'=>'yeoh.chan1#gmail.com'));
$rows=$command->queryAll();
This works because all the statement clauses (except distinct) return the command object, and can be strung together. If you need distinct, you can make ->setDistinct() the last item in the chain.