Passing a column to a UDF - sql-server

I have a table which has a lot of SSN's and that needs to be passed to a UDF that would validate it and say if its valid or not.
For example, when I execute the following query I get an error:
SELECT [dbo].[f_Is_Valid_SSN_Regex]( (select SSN from dbo.table_name))
The error that I get
Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
I dont think this requires a cursor (I would hate to have that), but is there a way to validate all the records on that column using this function?
Thanks,
RV

You would use a regular select for this:
SELECT SSN, [dbo].f_Is_Valid_SSN_Regex(SSN)
from dbo.table_name;
If you want to see if all of them pass, then use aggregation:
SELECT MIN(dbo.f_Is_Valid_SSN_Regex(SSN))
from dbo.table_name;
If the function return 0 for fails and 1 for passes, then this will return 1 only if all pass.

Related

How to dynamically replace a column value with another value based on condition

I am trying to dynamically change field value using a select query based on the person's previous room number.
Below are the data sample and the query I have tried. But it is throwing an error saying that there are multiple values returned by the inner query.
,A.[Room],A.[CSR],A.[MemberShip],A.[NatCode]
,A.[MarketCode],A.[Adult],A.[Children],A.[ArrDate]
,A.[DepDate],A.[ResvStatus], CASE WHEN A.[Room]>9000 THEN (SELECT MIN(A.[Room])FROM [RESDETAILS] C WHERE C.GuestName=A.GuestName) ELSE A.[Room] END AS [Room]
FROM [ITHAAFUSHI].[dbo].[RESDETAILS] A
WHERE [GuestName]= 'Mr Jobin Joseph'
GROUP BY
A.[BusinessDate],A.[GuestName],A.[TravelAgent]
,A.[Room],A.[CSR],A.[MemberShip],A.[NatCode]
,A.[MarketCode],A.[Adult],A.[Children],A.[ArrDate]
,A.[DepDate],A.[ResvStatus]
"Subquery returned more than 1 value. This is not permitted when the
subquery follows =, !=, <, < =,>, >= or when the subquery is used as
an expression."
Below is the expected result when Room No is >9000
Your (SELECT MIN(A.[Room])FROM [RESDETAILS] C WHERE C.GuestName=A.GuestName)
return more than 1 row so you need to use group by inside :
SELECT MIN(A.[Room])FROM [RESDETAILS] C WHERE C.GuestName=A.GuestName GROUP BY C.GuestName)

Repeating values in single-column table

I know this title isn't the best one, but i couldn't formulate a better one.
I have a function similar to STRING_SPLIT(), which return a single-column table with one row per split. What i need to do is keep the values from the other columns the same in the new rows.
I have a #TEMP Table with many lines like the following one:
INSERT INTO #TEMP([A], [ToSplit], [C], [D]) SELECT '549618', 'AAA, BBB', '1.7', '6'
I want to turn that line into two lines, one with AAA, the other with BBB, with the other values remaining equal.
I tried in the select list:
SELECT *, (SELECT * FROM [dbo].[ufn_split](ToSplit,',')) FROM #TEMP
ERROR: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Then as a condition (i used IN because it's the only that allow subqueries):
SELECT A, ToSplit FROM #TEMP
WHERE ToSplit IN (SELECT * FROM [dbo].[ufn_split](ToSplit,','))
No errors, but it only returns the rows that don't need the split. It would only work with LIKE, which is not allowed.
So i tried to put a subquery inside the method to create a single column table with one split value per row, that i would go row by row, use `LIKE %ToSplit% on the #TEMP, but again, subqueries not allowed.
SELECT * FROM [dbo].[ufn_split]((SELECT ToSplit FROM #TEMP),',')
ERROR: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
My question is, how can i split the values in ToSplit and keep the other columns values?
Please try like this .use CROSS APPLY
SELECT *
FROM #TEMP
CROSS APPLY
(
SELECT * FROM [dbo].[ufn_split](ToSplit,',')
)u
that will work on SQL SERVER 2016 and to unlimited values.
SELECT
t.*, LTRIM([value])
FROM #TEMP t
CROSS APPLY string_split([ToSplit], ',')

inserting multiple rows into SQL

I'm trying to insert lots of rows into a 2 column table at once where one of the values remains constant. This is what I have tried: -
insert into testtable (value1,value2)
select
123,
( SELECT [title] FROM [dbo].[images])
This gives me the following error:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
I could insert each row one at a time but I was wondering if there is a way I g=could do the whole lot in one go.
You have a syntax error, do not put two SELECT in there :
INSERT INTO testtable (value1,value2)
SELECT 123, [title]
FROM [dbo].[images];

Calculation between table with multiple rows

I am encountering a problem of doing calculation between table in multiple rows.
This is my code:
UPDATE StockList
SET stkQuantity = stkQuantity - (SELECT quantity FROM mCalculate)
WHERE stkID = (SELECT stkID FROM mCalculate)
If table mCalculate has only one row of data, the calculation in StockList is successfully, but if table mCalculate has multiple rows of data, I get an error:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Can anyone help me solve this problem and explain to me what's the problem I am having?
Image to refer:
Window:
Database:
You have to use join instead of sub query in this case
UPDATE S
SET stkQuantity = stkQuantity - M.quantity
From stocklist s
Join mcalculate m
On s.stkid = m.stkid
Among other issues, this line here:
WHERE stkID = (SELECT stkID FROM mCalculate)
The = needs a single value, so unless your mCalculate table has only 1 row you will be getting errors.
Your error of: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. is most likely due to the WHERE clause.
Your sub-select
(SELECT quantity FROM mCalculate)
Needs a WHERE clause that ensures this select returns only one row. Ditto for this:
(SELECT stkID FROM mCalculate)
Without the SCHEMA definitions for these tables, it's hard to help you figure out exactly what that WHERE clause should be.

How to update a column using group by in SQL

I have two tables and I want to update one row from GROUP BY data
This is my code:
2nd code:
UPDATE [TABLE].[dbo].[Movies]
SET [NumFrames] =
(SELECT COUNT(ImageURL) as "Count"
FROM [TABLE].[dbo].[Frames]
GROUP BY Movie_Id)
GO
1st code:
(SELECT COUNT(ImageURL) as "Count"
FROM [TABLE].[dbo].[Frames]
GROUP BY Movie_Id
1st code give me a row with numbers
Count
12
6
10
10
10
I want to insert it into Movies.NumFrames
2nd code give me an Error
Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1
value. This is not permitted when the subquery follows =, !=, <, <=
, >, >= or when the subquery is used as an expression.
Please help
I'm sure it's simple
You need to use a WHERE-clause (GROUP BY is not necessary any more).
Otherwise your sub-query returns one row for each Movie_Id, so you have more than one row to use as source for your update.
UPDATE [TABLE].[dbo].[Movies]
SET [NumFrames] =
( SELECT COUNT(ImageURL) as "Count"
FROM [TABLE].[dbo].[Frames]
WHERE [TABLE].[dbo].[Frames].Movie_Id = [TABLE].[dbo].[Movies].Movie_Id
)

Resources