getting an error while converting '11-1' to INT in sql server
I am not able to convert '11-1' to INT in sql server, the result should be 10.
i tried with convert and cast but getting an error.
sql sql-server
|
show 4 more comments
I am not able to convert '11-1' to INT in sql server, the result should be 10.
i tried with convert and cast but getting an error.
sql sql-server
if you mean you are basically doingCAST('11-1' AS INT)
then that will clearly complain. It is a string not an integer equation.
– arahman
Nov 15 '18 at 13:10
How to handle this case?
– Girish Mulgund
Nov 15 '18 at 13:11
what is the logic to convert it on 10 ??
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:11
@ZaynulAbadinTuhin 11-1 = 10
– arahman
Nov 15 '18 at 13:13
@arahman . . . You would need to use dynamic SQL.
– Gordon Linoff
Nov 15 '18 at 13:13
|
show 4 more comments
I am not able to convert '11-1' to INT in sql server, the result should be 10.
i tried with convert and cast but getting an error.
sql sql-server
I am not able to convert '11-1' to INT in sql server, the result should be 10.
i tried with convert and cast but getting an error.
sql sql-server
sql sql-server
asked Nov 15 '18 at 13:09
Girish MulgundGirish Mulgund
3015
3015
if you mean you are basically doingCAST('11-1' AS INT)
then that will clearly complain. It is a string not an integer equation.
– arahman
Nov 15 '18 at 13:10
How to handle this case?
– Girish Mulgund
Nov 15 '18 at 13:11
what is the logic to convert it on 10 ??
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:11
@ZaynulAbadinTuhin 11-1 = 10
– arahman
Nov 15 '18 at 13:13
@arahman . . . You would need to use dynamic SQL.
– Gordon Linoff
Nov 15 '18 at 13:13
|
show 4 more comments
if you mean you are basically doingCAST('11-1' AS INT)
then that will clearly complain. It is a string not an integer equation.
– arahman
Nov 15 '18 at 13:10
How to handle this case?
– Girish Mulgund
Nov 15 '18 at 13:11
what is the logic to convert it on 10 ??
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:11
@ZaynulAbadinTuhin 11-1 = 10
– arahman
Nov 15 '18 at 13:13
@arahman . . . You would need to use dynamic SQL.
– Gordon Linoff
Nov 15 '18 at 13:13
if you mean you are basically doing
CAST('11-1' AS INT)
then that will clearly complain. It is a string not an integer equation.– arahman
Nov 15 '18 at 13:10
if you mean you are basically doing
CAST('11-1' AS INT)
then that will clearly complain. It is a string not an integer equation.– arahman
Nov 15 '18 at 13:10
How to handle this case?
– Girish Mulgund
Nov 15 '18 at 13:11
How to handle this case?
– Girish Mulgund
Nov 15 '18 at 13:11
what is the logic to convert it on 10 ??
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:11
what is the logic to convert it on 10 ??
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:11
@ZaynulAbadinTuhin 11-1 = 10
– arahman
Nov 15 '18 at 13:13
@ZaynulAbadinTuhin 11-1 = 10
– arahman
Nov 15 '18 at 13:13
@arahman . . . You would need to use dynamic SQL.
– Gordon Linoff
Nov 15 '18 at 13:13
@arahman . . . You would need to use dynamic SQL.
– Gordon Linoff
Nov 15 '18 at 13:13
|
show 4 more comments
5 Answers
5
active
oldest
votes
As has been discussed '11-1'
can't be converted to an int
because it's a varchar
representing a numerical
expression.
The only way to reliably derive an expression stored as a varchar
is by using dynamic SQL, which, has it own problems; specifically SQL injection.
Assuming that your data is coming from a table, and that these varchar
expressions only contain simple arithmetic, you could do something like this:
CREATE TABLE dbo.test (ID int IDENTITY(1,1),
varcharExpression varchar(20));
INSERT INTO dbo.test (varcharExpression)
VALUES('11-1'),('12*2'),('2+9'),('15/3'),
('2^4'), --not supported in this example. SQL Server doesn't use ^, it uses POWER: POWER(2,4)
('DROP TABLE dbo.test;'); --Intentional example of an injection attempt.
GO
DECLARE @SQL nvarchar(MAX);
SET @SQL = STUFF((SELECT NCHAR(10) + N'UNION ALL' + NCHAR(10) +
N'SELECT ' + CONVERT(varchar(6),ID) + N' AS ID,' + NCHAR(10) +
N' ' + CASE WHEN varcharExpression NOT LIKE '%[^0-9-+*/]%' ESCAPE '' THEN varcharExpression ELSE N'NULL' END + N' AS ExpressionValue'
FROM dbo.test
ORDER BY ID ASC
FOR XML PATH(N'')),1,10,N'') + ';';
PRINT @SQL;
EXEC sp_executesql @SQL;
GO
DROP TABLE dbo.test
add a comment |
'11-1'
is a string and can't be converted to INT
. You can do that as
SELECT (CAST (11-1) AS INT)
Or by using Dynamic SQL as
DECLARE @SQL NVARCHAR(MAX) = N'SELECT 11-1';
EXECUTE sp_executesql @SQL;
Or even
CREATE TABLE Operations(
ID INT IDENTITY(1, 1),
Operation VARCHAR(45)
);
INSERT INTO Operations VALUES
('10-1'),
('10+1'),
('(5+5) - 5'),
('5+5');
DECLARE @SQL NVARCHAR(MAX) = N'SELECT ';
SELECT @SQL = @SQL + Operation + ' ,'
FROM Operations
SET @SQL = LEFT(@SQL, LEN(@SQL) - 1);
EXECUTE sp_executesql @SQL;
Or if you want to get it as rows
SELECT @SQL = @SQL + Operation + ' UNION ALL SELECT '
FROM Operations
SET @SQL = LEFT(@SQL, LEN(@SQL) - 17);
EXECUTE sp_executesql @SQL;
You can also declare the @SQL
variable as follow if you want to name the column
DECLARE @SQL NVARCHAR(MAX) = N'SELECT Operations = ';
Demo
As a final note (or warning), be careful for SQL Injection if your column has other strings as it maybe malicious commands.
add a comment |
you can try like below, separate both part by using substring then
convert it into int then add both
SELECT convert(int, substring('11-1',0, charindex('-', '11-1')))+
convert(int, substring('11-1',charindex('-', '11-1'), len('11-1')))
It will return 10
You have to think, will that work for other arithmetic equations though...? The OP may have more equations and not just a subtraction.
– arahman
Nov 15 '18 at 13:18
2
@arahman i answered according to sample as there no other description and my answer met the op's requirement. am i wrong?
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:19
add a comment |
Use dynamic SQL to parse expression
DECLARE @result int, @sql nvarchar(max);
SET @sql = N'SELECT ' + '11 - 1';
EXEC sp_executesql @sql
or
DECLARE @result int, @sql nvarchar(max);
SET @sql = N'SELECT @result = ' + '11 - 1';
EXEC sp_executesql @sql, N'@result int OUTPUT', @result = @result OUTPUT
SELECT @result
This will return 10
add a comment |
The example below shows how you could evaluate the T-SQL expression stored in a table column. However, I would advise against this approach unless the value is from a source that is fully trusted. Otherwise, there is a SQL injection risk.
Also, this method cannot be used easily to return values from multiple rows in a single result. You would need a cursor to evaluate and insert each result into a temp table/variable and then select from the table as the final result.
DECLARE @Foo TABLE(
FooID int
, Expression nvarchar(10) NOT NULL
)
INSERT INTO @Foo VALUES(1, '11-1');
DECLARE @sql nvarchar(MAX) = N'SELECT ' + (SELECT Expression FROM @foo WHERE FooID = 1) + N' AS Result;';
EXECUTE (@sql);
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53320220%2fgetting-an-error-while-converting-11-1-to-int-in-sql-server%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
As has been discussed '11-1'
can't be converted to an int
because it's a varchar
representing a numerical
expression.
The only way to reliably derive an expression stored as a varchar
is by using dynamic SQL, which, has it own problems; specifically SQL injection.
Assuming that your data is coming from a table, and that these varchar
expressions only contain simple arithmetic, you could do something like this:
CREATE TABLE dbo.test (ID int IDENTITY(1,1),
varcharExpression varchar(20));
INSERT INTO dbo.test (varcharExpression)
VALUES('11-1'),('12*2'),('2+9'),('15/3'),
('2^4'), --not supported in this example. SQL Server doesn't use ^, it uses POWER: POWER(2,4)
('DROP TABLE dbo.test;'); --Intentional example of an injection attempt.
GO
DECLARE @SQL nvarchar(MAX);
SET @SQL = STUFF((SELECT NCHAR(10) + N'UNION ALL' + NCHAR(10) +
N'SELECT ' + CONVERT(varchar(6),ID) + N' AS ID,' + NCHAR(10) +
N' ' + CASE WHEN varcharExpression NOT LIKE '%[^0-9-+*/]%' ESCAPE '' THEN varcharExpression ELSE N'NULL' END + N' AS ExpressionValue'
FROM dbo.test
ORDER BY ID ASC
FOR XML PATH(N'')),1,10,N'') + ';';
PRINT @SQL;
EXEC sp_executesql @SQL;
GO
DROP TABLE dbo.test
add a comment |
As has been discussed '11-1'
can't be converted to an int
because it's a varchar
representing a numerical
expression.
The only way to reliably derive an expression stored as a varchar
is by using dynamic SQL, which, has it own problems; specifically SQL injection.
Assuming that your data is coming from a table, and that these varchar
expressions only contain simple arithmetic, you could do something like this:
CREATE TABLE dbo.test (ID int IDENTITY(1,1),
varcharExpression varchar(20));
INSERT INTO dbo.test (varcharExpression)
VALUES('11-1'),('12*2'),('2+9'),('15/3'),
('2^4'), --not supported in this example. SQL Server doesn't use ^, it uses POWER: POWER(2,4)
('DROP TABLE dbo.test;'); --Intentional example of an injection attempt.
GO
DECLARE @SQL nvarchar(MAX);
SET @SQL = STUFF((SELECT NCHAR(10) + N'UNION ALL' + NCHAR(10) +
N'SELECT ' + CONVERT(varchar(6),ID) + N' AS ID,' + NCHAR(10) +
N' ' + CASE WHEN varcharExpression NOT LIKE '%[^0-9-+*/]%' ESCAPE '' THEN varcharExpression ELSE N'NULL' END + N' AS ExpressionValue'
FROM dbo.test
ORDER BY ID ASC
FOR XML PATH(N'')),1,10,N'') + ';';
PRINT @SQL;
EXEC sp_executesql @SQL;
GO
DROP TABLE dbo.test
add a comment |
As has been discussed '11-1'
can't be converted to an int
because it's a varchar
representing a numerical
expression.
The only way to reliably derive an expression stored as a varchar
is by using dynamic SQL, which, has it own problems; specifically SQL injection.
Assuming that your data is coming from a table, and that these varchar
expressions only contain simple arithmetic, you could do something like this:
CREATE TABLE dbo.test (ID int IDENTITY(1,1),
varcharExpression varchar(20));
INSERT INTO dbo.test (varcharExpression)
VALUES('11-1'),('12*2'),('2+9'),('15/3'),
('2^4'), --not supported in this example. SQL Server doesn't use ^, it uses POWER: POWER(2,4)
('DROP TABLE dbo.test;'); --Intentional example of an injection attempt.
GO
DECLARE @SQL nvarchar(MAX);
SET @SQL = STUFF((SELECT NCHAR(10) + N'UNION ALL' + NCHAR(10) +
N'SELECT ' + CONVERT(varchar(6),ID) + N' AS ID,' + NCHAR(10) +
N' ' + CASE WHEN varcharExpression NOT LIKE '%[^0-9-+*/]%' ESCAPE '' THEN varcharExpression ELSE N'NULL' END + N' AS ExpressionValue'
FROM dbo.test
ORDER BY ID ASC
FOR XML PATH(N'')),1,10,N'') + ';';
PRINT @SQL;
EXEC sp_executesql @SQL;
GO
DROP TABLE dbo.test
As has been discussed '11-1'
can't be converted to an int
because it's a varchar
representing a numerical
expression.
The only way to reliably derive an expression stored as a varchar
is by using dynamic SQL, which, has it own problems; specifically SQL injection.
Assuming that your data is coming from a table, and that these varchar
expressions only contain simple arithmetic, you could do something like this:
CREATE TABLE dbo.test (ID int IDENTITY(1,1),
varcharExpression varchar(20));
INSERT INTO dbo.test (varcharExpression)
VALUES('11-1'),('12*2'),('2+9'),('15/3'),
('2^4'), --not supported in this example. SQL Server doesn't use ^, it uses POWER: POWER(2,4)
('DROP TABLE dbo.test;'); --Intentional example of an injection attempt.
GO
DECLARE @SQL nvarchar(MAX);
SET @SQL = STUFF((SELECT NCHAR(10) + N'UNION ALL' + NCHAR(10) +
N'SELECT ' + CONVERT(varchar(6),ID) + N' AS ID,' + NCHAR(10) +
N' ' + CASE WHEN varcharExpression NOT LIKE '%[^0-9-+*/]%' ESCAPE '' THEN varcharExpression ELSE N'NULL' END + N' AS ExpressionValue'
FROM dbo.test
ORDER BY ID ASC
FOR XML PATH(N'')),1,10,N'') + ';';
PRINT @SQL;
EXEC sp_executesql @SQL;
GO
DROP TABLE dbo.test
edited Nov 15 '18 at 14:03
answered Nov 15 '18 at 13:31
LarnuLarnu
20.5k51732
20.5k51732
add a comment |
add a comment |
'11-1'
is a string and can't be converted to INT
. You can do that as
SELECT (CAST (11-1) AS INT)
Or by using Dynamic SQL as
DECLARE @SQL NVARCHAR(MAX) = N'SELECT 11-1';
EXECUTE sp_executesql @SQL;
Or even
CREATE TABLE Operations(
ID INT IDENTITY(1, 1),
Operation VARCHAR(45)
);
INSERT INTO Operations VALUES
('10-1'),
('10+1'),
('(5+5) - 5'),
('5+5');
DECLARE @SQL NVARCHAR(MAX) = N'SELECT ';
SELECT @SQL = @SQL + Operation + ' ,'
FROM Operations
SET @SQL = LEFT(@SQL, LEN(@SQL) - 1);
EXECUTE sp_executesql @SQL;
Or if you want to get it as rows
SELECT @SQL = @SQL + Operation + ' UNION ALL SELECT '
FROM Operations
SET @SQL = LEFT(@SQL, LEN(@SQL) - 17);
EXECUTE sp_executesql @SQL;
You can also declare the @SQL
variable as follow if you want to name the column
DECLARE @SQL NVARCHAR(MAX) = N'SELECT Operations = ';
Demo
As a final note (or warning), be careful for SQL Injection if your column has other strings as it maybe malicious commands.
add a comment |
'11-1'
is a string and can't be converted to INT
. You can do that as
SELECT (CAST (11-1) AS INT)
Or by using Dynamic SQL as
DECLARE @SQL NVARCHAR(MAX) = N'SELECT 11-1';
EXECUTE sp_executesql @SQL;
Or even
CREATE TABLE Operations(
ID INT IDENTITY(1, 1),
Operation VARCHAR(45)
);
INSERT INTO Operations VALUES
('10-1'),
('10+1'),
('(5+5) - 5'),
('5+5');
DECLARE @SQL NVARCHAR(MAX) = N'SELECT ';
SELECT @SQL = @SQL + Operation + ' ,'
FROM Operations
SET @SQL = LEFT(@SQL, LEN(@SQL) - 1);
EXECUTE sp_executesql @SQL;
Or if you want to get it as rows
SELECT @SQL = @SQL + Operation + ' UNION ALL SELECT '
FROM Operations
SET @SQL = LEFT(@SQL, LEN(@SQL) - 17);
EXECUTE sp_executesql @SQL;
You can also declare the @SQL
variable as follow if you want to name the column
DECLARE @SQL NVARCHAR(MAX) = N'SELECT Operations = ';
Demo
As a final note (or warning), be careful for SQL Injection if your column has other strings as it maybe malicious commands.
add a comment |
'11-1'
is a string and can't be converted to INT
. You can do that as
SELECT (CAST (11-1) AS INT)
Or by using Dynamic SQL as
DECLARE @SQL NVARCHAR(MAX) = N'SELECT 11-1';
EXECUTE sp_executesql @SQL;
Or even
CREATE TABLE Operations(
ID INT IDENTITY(1, 1),
Operation VARCHAR(45)
);
INSERT INTO Operations VALUES
('10-1'),
('10+1'),
('(5+5) - 5'),
('5+5');
DECLARE @SQL NVARCHAR(MAX) = N'SELECT ';
SELECT @SQL = @SQL + Operation + ' ,'
FROM Operations
SET @SQL = LEFT(@SQL, LEN(@SQL) - 1);
EXECUTE sp_executesql @SQL;
Or if you want to get it as rows
SELECT @SQL = @SQL + Operation + ' UNION ALL SELECT '
FROM Operations
SET @SQL = LEFT(@SQL, LEN(@SQL) - 17);
EXECUTE sp_executesql @SQL;
You can also declare the @SQL
variable as follow if you want to name the column
DECLARE @SQL NVARCHAR(MAX) = N'SELECT Operations = ';
Demo
As a final note (or warning), be careful for SQL Injection if your column has other strings as it maybe malicious commands.
'11-1'
is a string and can't be converted to INT
. You can do that as
SELECT (CAST (11-1) AS INT)
Or by using Dynamic SQL as
DECLARE @SQL NVARCHAR(MAX) = N'SELECT 11-1';
EXECUTE sp_executesql @SQL;
Or even
CREATE TABLE Operations(
ID INT IDENTITY(1, 1),
Operation VARCHAR(45)
);
INSERT INTO Operations VALUES
('10-1'),
('10+1'),
('(5+5) - 5'),
('5+5');
DECLARE @SQL NVARCHAR(MAX) = N'SELECT ';
SELECT @SQL = @SQL + Operation + ' ,'
FROM Operations
SET @SQL = LEFT(@SQL, LEN(@SQL) - 1);
EXECUTE sp_executesql @SQL;
Or if you want to get it as rows
SELECT @SQL = @SQL + Operation + ' UNION ALL SELECT '
FROM Operations
SET @SQL = LEFT(@SQL, LEN(@SQL) - 17);
EXECUTE sp_executesql @SQL;
You can also declare the @SQL
variable as follow if you want to name the column
DECLARE @SQL NVARCHAR(MAX) = N'SELECT Operations = ';
Demo
As a final note (or warning), be careful for SQL Injection if your column has other strings as it maybe malicious commands.
edited Nov 15 '18 at 14:08
answered Nov 15 '18 at 13:14
SamiSami
8,99831242
8,99831242
add a comment |
add a comment |
you can try like below, separate both part by using substring then
convert it into int then add both
SELECT convert(int, substring('11-1',0, charindex('-', '11-1')))+
convert(int, substring('11-1',charindex('-', '11-1'), len('11-1')))
It will return 10
You have to think, will that work for other arithmetic equations though...? The OP may have more equations and not just a subtraction.
– arahman
Nov 15 '18 at 13:18
2
@arahman i answered according to sample as there no other description and my answer met the op's requirement. am i wrong?
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:19
add a comment |
you can try like below, separate both part by using substring then
convert it into int then add both
SELECT convert(int, substring('11-1',0, charindex('-', '11-1')))+
convert(int, substring('11-1',charindex('-', '11-1'), len('11-1')))
It will return 10
You have to think, will that work for other arithmetic equations though...? The OP may have more equations and not just a subtraction.
– arahman
Nov 15 '18 at 13:18
2
@arahman i answered according to sample as there no other description and my answer met the op's requirement. am i wrong?
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:19
add a comment |
you can try like below, separate both part by using substring then
convert it into int then add both
SELECT convert(int, substring('11-1',0, charindex('-', '11-1')))+
convert(int, substring('11-1',charindex('-', '11-1'), len('11-1')))
It will return 10
you can try like below, separate both part by using substring then
convert it into int then add both
SELECT convert(int, substring('11-1',0, charindex('-', '11-1')))+
convert(int, substring('11-1',charindex('-', '11-1'), len('11-1')))
It will return 10
edited Nov 15 '18 at 13:18
answered Nov 15 '18 at 13:15
Zaynul Abadin TuhinZaynul Abadin Tuhin
16k21033
16k21033
You have to think, will that work for other arithmetic equations though...? The OP may have more equations and not just a subtraction.
– arahman
Nov 15 '18 at 13:18
2
@arahman i answered according to sample as there no other description and my answer met the op's requirement. am i wrong?
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:19
add a comment |
You have to think, will that work for other arithmetic equations though...? The OP may have more equations and not just a subtraction.
– arahman
Nov 15 '18 at 13:18
2
@arahman i answered according to sample as there no other description and my answer met the op's requirement. am i wrong?
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:19
You have to think, will that work for other arithmetic equations though...? The OP may have more equations and not just a subtraction.
– arahman
Nov 15 '18 at 13:18
You have to think, will that work for other arithmetic equations though...? The OP may have more equations and not just a subtraction.
– arahman
Nov 15 '18 at 13:18
2
2
@arahman i answered according to sample as there no other description and my answer met the op's requirement. am i wrong?
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:19
@arahman i answered according to sample as there no other description and my answer met the op's requirement. am i wrong?
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:19
add a comment |
Use dynamic SQL to parse expression
DECLARE @result int, @sql nvarchar(max);
SET @sql = N'SELECT ' + '11 - 1';
EXEC sp_executesql @sql
or
DECLARE @result int, @sql nvarchar(max);
SET @sql = N'SELECT @result = ' + '11 - 1';
EXEC sp_executesql @sql, N'@result int OUTPUT', @result = @result OUTPUT
SELECT @result
This will return 10
add a comment |
Use dynamic SQL to parse expression
DECLARE @result int, @sql nvarchar(max);
SET @sql = N'SELECT ' + '11 - 1';
EXEC sp_executesql @sql
or
DECLARE @result int, @sql nvarchar(max);
SET @sql = N'SELECT @result = ' + '11 - 1';
EXEC sp_executesql @sql, N'@result int OUTPUT', @result = @result OUTPUT
SELECT @result
This will return 10
add a comment |
Use dynamic SQL to parse expression
DECLARE @result int, @sql nvarchar(max);
SET @sql = N'SELECT ' + '11 - 1';
EXEC sp_executesql @sql
or
DECLARE @result int, @sql nvarchar(max);
SET @sql = N'SELECT @result = ' + '11 - 1';
EXEC sp_executesql @sql, N'@result int OUTPUT', @result = @result OUTPUT
SELECT @result
This will return 10
Use dynamic SQL to parse expression
DECLARE @result int, @sql nvarchar(max);
SET @sql = N'SELECT ' + '11 - 1';
EXEC sp_executesql @sql
or
DECLARE @result int, @sql nvarchar(max);
SET @sql = N'SELECT @result = ' + '11 - 1';
EXEC sp_executesql @sql, N'@result int OUTPUT', @result = @result OUTPUT
SELECT @result
This will return 10
answered Nov 15 '18 at 13:23
sergeserge
70147
70147
add a comment |
add a comment |
The example below shows how you could evaluate the T-SQL expression stored in a table column. However, I would advise against this approach unless the value is from a source that is fully trusted. Otherwise, there is a SQL injection risk.
Also, this method cannot be used easily to return values from multiple rows in a single result. You would need a cursor to evaluate and insert each result into a temp table/variable and then select from the table as the final result.
DECLARE @Foo TABLE(
FooID int
, Expression nvarchar(10) NOT NULL
)
INSERT INTO @Foo VALUES(1, '11-1');
DECLARE @sql nvarchar(MAX) = N'SELECT ' + (SELECT Expression FROM @foo WHERE FooID = 1) + N' AS Result;';
EXECUTE (@sql);
add a comment |
The example below shows how you could evaluate the T-SQL expression stored in a table column. However, I would advise against this approach unless the value is from a source that is fully trusted. Otherwise, there is a SQL injection risk.
Also, this method cannot be used easily to return values from multiple rows in a single result. You would need a cursor to evaluate and insert each result into a temp table/variable and then select from the table as the final result.
DECLARE @Foo TABLE(
FooID int
, Expression nvarchar(10) NOT NULL
)
INSERT INTO @Foo VALUES(1, '11-1');
DECLARE @sql nvarchar(MAX) = N'SELECT ' + (SELECT Expression FROM @foo WHERE FooID = 1) + N' AS Result;';
EXECUTE (@sql);
add a comment |
The example below shows how you could evaluate the T-SQL expression stored in a table column. However, I would advise against this approach unless the value is from a source that is fully trusted. Otherwise, there is a SQL injection risk.
Also, this method cannot be used easily to return values from multiple rows in a single result. You would need a cursor to evaluate and insert each result into a temp table/variable and then select from the table as the final result.
DECLARE @Foo TABLE(
FooID int
, Expression nvarchar(10) NOT NULL
)
INSERT INTO @Foo VALUES(1, '11-1');
DECLARE @sql nvarchar(MAX) = N'SELECT ' + (SELECT Expression FROM @foo WHERE FooID = 1) + N' AS Result;';
EXECUTE (@sql);
The example below shows how you could evaluate the T-SQL expression stored in a table column. However, I would advise against this approach unless the value is from a source that is fully trusted. Otherwise, there is a SQL injection risk.
Also, this method cannot be used easily to return values from multiple rows in a single result. You would need a cursor to evaluate and insert each result into a temp table/variable and then select from the table as the final result.
DECLARE @Foo TABLE(
FooID int
, Expression nvarchar(10) NOT NULL
)
INSERT INTO @Foo VALUES(1, '11-1');
DECLARE @sql nvarchar(MAX) = N'SELECT ' + (SELECT Expression FROM @foo WHERE FooID = 1) + N' AS Result;';
EXECUTE (@sql);
answered Nov 15 '18 at 13:29
Dan GuzmanDan Guzman
24k31642
24k31642
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53320220%2fgetting-an-error-while-converting-11-1-to-int-in-sql-server%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
if you mean you are basically doing
CAST('11-1' AS INT)
then that will clearly complain. It is a string not an integer equation.– arahman
Nov 15 '18 at 13:10
How to handle this case?
– Girish Mulgund
Nov 15 '18 at 13:11
what is the logic to convert it on 10 ??
– Zaynul Abadin Tuhin
Nov 15 '18 at 13:11
@ZaynulAbadinTuhin 11-1 = 10
– arahman
Nov 15 '18 at 13:13
@arahman . . . You would need to use dynamic SQL.
– Gordon Linoff
Nov 15 '18 at 13:13