I have a database with a field named Field1 that has 100 nchars per entry.
Each time I add a value, it is stored as:
"value (100-ValueLength Spaces) "
So Basically each stored value has a string of spaces after it. This is getting to be an issue when I try doing:
if (value == "Example")
because of all of the empty spaces after the string.
How can I get it so the stored values don't have all of these trailing spaces?
If you want a variable-length string, use nvarchar(100) instead of nchar(100). The later always has 100 characters, the former can have up to 100 characters, but doesn't fill up the space.
Use the sql LTRIM and RTRIM functions when inserting.
Are you able to use a nvarchar, so that way there isnt padding added if you don't meet the required string length. If so that might be better then constantly having to trim your string entry.
Related
I have a column of strings that have an '&' at the beginning and end of each one that I need to remove for a Crystal report I'm creating. I'm writing the SQL code outside of Crystal I am using Intersystems Cache SQL. Below is an example:
&This& This
&is& is
&What& what
&it& I
&looks& need
&like& it
&now& to
look
like
Any suggestions would be greatly appreciated!!!
Assuming the ampersands are always positioned as both the leading and trailing characters, here's at least maybe a start. Use a combination of SUBSTR (or SUBSTRING, if using stream data) and LENGTH, like so:
SELECT SUBSTR((SELECT column FROM table), 2, LENGTH(SELECT column FROM table) - 2)
This should return a substring that starts counting at the 2nd character [of the original string, given by the first sub-expression/argument to SUBSTR], counting up for the total number of characters [of the original string] less 2 (i.e. less the two ampersands).
If you need to including trailing blanks and/or the string termination character, you may need to use a different variation of the LENGTH function. See resources for details on these functions and their variants:
https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_substr
https://cedocs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_length
Here's a Crystal formula that does the same:
ExtractString({YourData},"&","&")
I am trying to use RIGHT function in SQL Server Management Studio 17. But I continue getting a blank result. I used TRIM function to update my data, and then used LEN function to test the length, there is no extra space in this column.
But when I used TRIM function inside RIGHT, I can get the result I want.
So what is the problem here and how can I solve it?
Thank you!
SELECT RIGHT(FIRST_NAME,3) FROM Worker;
SELECT LEN(FIRST_NAME) FROM Worker;
SELECT RIGHT(TRIM(FIRST_NAME),3) FROM Worker;
The problem is probably that you have use char() instead of varchar() for the first_name. This automatically pads the name with spaces.
In general, you want to store strings as varchar(). There are some circumstances where char() is useful -- such as for country codes which are uniformly 2- or 3- characters. But in general, you want varchar().
This is a known feature of using LEN. Simply switch to DATALENGTH instead and you'll get the correct length for each column:
SELECT DATALENGTH(FIRST_NAME) FROM Worker;
For LEN, taken here directly from the article:
Returns the number of characters of the specified string expression,
excluding trailing blanks.
And DATALENGTH in turn:
Returns the number of bytes used to represent any expression.
If you would like to remove the trailing spaces from your existing rows, run a simple UPDATE query:
UPDATE Worker SET FIRST_NAME = TRIM(FIRST_NAME);
So i have a file I'm creating using SQL Server 2012.
Many of the columns are optional or unused, and in place of the characters that would normally be there we are asked to zero-fill numeric columns, and space-fill alphanumeric columns.
Now I have a column called CDD and it's 256 characters long.
Is there a simpler way I can fill this column other than pressing the space bar 256 times in single quotes?
The file is Fixed Width so I have to have 256 spaces in this column for it to import correctly. I was looking at replicate and stuff, but they don't make sense being that the column doesn't have an original string to replace.
Replicate works with zeros but how can I validate it with spaces? The column doesn't expand like it would if there was an actual character in it...Does SQL-Server do any collapsing of white space in this way?
You're going to want to use the replicate function.
SELECT REPLICATE(' ',256)
This function will repeat space (or whatever string you put in the first parameter) 256 (or however many in the second parameter) times.
In addition to REPLICATE you can also use
SELECT SPACE(256);
As far as "the column expanding", the column will not appear expanded in SSMS unless you click on 'Results in Text' (instead of grid). If you use the LEN function it will return 0, but DATALENGTH will return either the actual number of spaces requested for a varchar column, or the defined length of a char column. Either way, if you copy the output into a text editor, you will see that it is indeed a string of empty spaces.
Does anyone know a good way to count characters in a text (nvarchar) column in Sql Server?
The values there can be text, symbols and/or numbers.
So far I used sum(datalength(column))/2 but this only works for text. (it's a method based on datalength and this can vary from a type to another).
You can find the number of characters using system function LEN.
i.e.
SELECT LEN(Column) FROM TABLE
Use
SELECT length(yourfield) FROM table;
Use the LEN function:
Returns the number of characters of the specified string expression, excluding trailing blanks.
Doesn't SELECT LEN(column_name) work?
text doesn't work with len function.
ntext, text, and image data types will be removed in a future version
of Microsoft SQL Server. Avoid using these data types in new
development work, and plan to modify applications that currently use
them. Use nvarchar(max), varchar(max), and varbinary(max) instead. For
more information, see Using Large-Value Data Types.
Source
I had a similar problem recently, and here's what I did:
SELECT
columnname as 'Original_Value',
LEN(LTRIM(columnname)) as 'Orig_Val_Char_Count',
N'['+columnname+']' as 'UnicodeStr_Value',
LEN(N'['+columnname+']')-2 as 'True_Char_Count'
FROM mytable
The first two columns look at the original value and count the characters (minus leading/trailing spaces).
I needed to compare that with the true count of characters, which is why I used the second LEN function. It sets the column value to a string, forces that string to Unicode, and then counts the characters.
By using the brackets, you ensure that any leading or trailing spaces are also counted as characters; of course, you don't want to count the brackets themselves, so you subtract 2 at the end.
An error-free column name syntax is [My Column] instead of My Column which causes an error.
An error-free string value syntax is '25,00' instead of 25,00 which causes an error.
I'm getting an error using single quotes to enclose values, if the column data type is numeric. Are there any other ways to enclose values safely for string or numeric data types?
Numeric values don't have any enclosures or comma's.
For strings, depending on your settings, in certain DB's it could be single or double quotes.
In SQL Server the Cast / Convert functions are regionally aware. Therefore use Convert in your query, passing the number as a quoted string, to convert it to the required decimal type. eg:
SELECT CONVERT(decimal(5,2),'1234,56')
You are probably getting an error when you use quotes because the string '25,00' is not a valid decimal number. Check your RDBMS documentation to see how strings are implicitly converted to number types.
Without the quotes, 25,00 is also invalid, I believe, regardless of your location. The SQL standard does not permit literal numbers to be specified using comma as the decimal separator.
A column name like My Column causes an error because of the space in it. [My Column] removes the ambiguity.
A value such as '25,00' is valid because the quotes make it a string, while 25,00 isn't a valid number (at least not in your part of the world) because of the comma.
If you were to insert 25,00 as a number, how is the DB able to distinguish it from two numbers?